文章目录
- 一.内置属性
- 1.\__slots__
- 2.\__doc__
- 3.\__module__ 和\__class__
- 4.\__dict__
- 5.\__getitem__、\__setitem__ 和\__delitem__
- 二.类属性和对象属性
- 三.私有属性和方法
- 1.私有属性和私有方法
- 2.访问私有属性和私有方法
一.内置属性
Python中有很多的内置属性,我们可以通过使用内置函数dir来查看一个对象支持的所有属性和方法。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
s1 = Student('zhangsan', 90)
print(dir(s1))
运行结果:
[‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’, ‘name’, ‘score’]
1._slots_
之前我们说过,Python中支持动态属性,可以直接给对象添加属性,但是,在某些情况下,我们想对属性进行管理,此时,就可以使用__slots__方法来实现。
class Student(object):
__slots__ = ('name', 'score') #控制了属性,只能对name和score属性进行修改,不能再添加属性
def __init__(self, name, score):
self.name = name
self.score = score
s1 = Student('zhangsan', 90)
s1.name='lisi' #修改name属性
print(s1.name) # lisi
s1.gender='male' #添加一个gender属性
print(s1.gender) #报错
2._doc_
可以用来展示类的描述信息。
class Student(object):
'''
Student():学生类
name:学生姓名
score:学生成绩
'''
def __init__(self, name, score):
self.name = name
self.score = score
print(Student.__doc__)
运行结果:
Student():学生类
name:学生姓名
score:学生成绩
3._module_ 和_class_
调用__module__ 可以查看当前操作的对象在哪个模块中;调用__class__ 可以查看当前操作的对象的类是什么。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
s1 = Student('zhangsan', 90)
print(s1.__module__)
print(s1.__class__)
运行结果:
main
<class ‘main.Student’>
4._dict_
把对象的属性和值以字典的形式显示出来。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
s1 = Student('zhangsan', 90)
print(s1.__dict__)
运行结果:
{‘name’: ‘zhangsan’, ‘score’: 90}
5._getitem_、_setitem_ 和_delitem_
如果想把对象当做字典一样来操作,可以使用这三种方法。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def __getitem__(self, key):
return self.__dict__[key]
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delitem__(self, key):
del self.__dict__[key]
s1 = Student('zhangsan', 90)
print(s1['name']) # 会调用 __getitem__ 方法,直接打印属性对应的值
s1['name'] = 'lisi' # 会调用对象的 __setitem__方法,修改属性对应的值
s1['score'] = 99
print(s1.name, s1.score)
del s1['score'] # 会调用 __delitem__ 方法,删除属性及对应的值
print(s1.__dict__)
运行结果:
zhangsan
lisi 99
{‘name’: ‘lisi’}
二.类属性和对象属性
类属性是类对象所拥有的属性,定义在类中;类属性可以通过类对象或者实例对象访问;类属性可以被该类的所有实例对象所共有。
通过类创建出来的对象被称为实例对象,对象属性也可以称为实例属性。实例属性要求每个对象为其单独开辟一个内存空间来记录数据,所以不同的对象的同名属性没有关联 ,互不影响。
class Student(object):
type = '学生' #在类中定义类属性
def __init__(self, name, score):
self.name = name
self.score = score
s1 = Student('zhangsan', 90) # 通过Student类创建出来的实例对象
#类属性可以通过类对象和实例对象来获取
print(Student.type) # 学生 通过类对象获取类属性
print(s1.type) # 学生 通过实例对象获取类属性
Student.type='human' # 类属性只能通过类对象来修改,实例对象无法修改类属性
print(s1.type) # human
注意:
- 尽量避免类属性和实例对象的属性同名,若同名,实例对象会优先访问实例对象的属性。
- 类属性只能通过类对象修改,不能通过实例对象修改。
- 类属性可以设置私有属性。
三.私有属性和方法
1.私有属性和私有方法
在实际开发中,对象的某些属性或者方法可能只希望在对象的内部使用,而不希望在外部被访问到,这时就可以定义私有属性和私有方法。
class Student(object):
def __init__(self,name):
self.name = name
self.__score = 80 # 使用 __ 修饰的属性,是私有属性
def __pass(self, line):
if self.__score >= line: # __score只能在对象内部使用
print('该学生成绩合格')
else:
print('该学生成绩不合格')
def test(self):
self.__pass(60) # __pass方法也只能在对象内部使用
s = Student('张三')
#print(s.__score) 会报错,不能直接访问对象内部的私有属性
s.test() # 该学生成绩合格
# s.__pass() 会报错,不能直接调用pass函数,它是私有方法。
2.访问私有属性和私有方法
私有属性和私有方法都不能直接调用。但是,我们也可以通过一些操作在外部访问一个对象的私有属性和方法。
1.直接访问
语法格式:在私有属性名或者方法名前面添加’_类名’
class Student(object):
def __init__(self,name):
self.name = name
self.__score = 80
def __pass(self, line):
if self.__score >= line:
print('该学生成绩合格')
else:
print('该学生成绩不合格')
s = Student('张三')
print(s._Student__score) # 80
s._Student__pass(90) # 该学生成绩不合格
使用对象名._类名__私有属性名 可以直接访问对象的私有属性(在实际开发中,不建议使用此方法来访问私有属性)
使用对象名._类名__函数名 可以直接调用对象的私有方法
2.定义方法访问私有变量
使用定义get和set方法这种方式来实现。
class Student(object):
def __init__(self,name):
self.name = name
self.__score = 80
def get_score(self): # 定义了get_score 方法,在这个方法里可以获取 __score的值
return self.__score
def set_score(self,new_score):# 定义了set_score 方法,在这个方法里可以修改 __score的值
self.__score=new_score
s = Student('张三')
print(s.get_score()) # 80
s.set_score(90)
print(s.get_score()) # 90