实例属性:类被实例化后才会具有的属性。
类属性:类定义后就存在,而且不需要实例化
私有属性:使用__开头的变量名加以标志,只有类对象自己能访问;使用_开头的变量名加以标注,应该只有类对象及其子类能访问(非强制),单下划线是标志性的不是限制性的,在类外是可以修改的
特殊属性:保存对象的元数据。
__doc__;__name__对象的名称;__dict__;__module__;__base__包含类对象的全部基类
特殊属性https://www.cnblogs.com/Security-Darren/p/4604942.html
#一般在__init__()方法中创建并初始化
class TestClass:
# 类属性使得相同类的不同实例共同持有相同变量
com=100
def __init__(self,length,width,height):
# 直接使用即定义self.<属性名>
self.length=length
self.width=width
self.height=height
self.__prv=10
def _volume(self):
self._volume = self.length * self.width * self.height
def pr(self):
print(self.length,self.width,self.height)
print(self.__prv)
test1=TestClass(3,4,5)
# 类外使用实例名.属性名方式定义和引用
print(test1.height)
# 5
test1.pr()
#3,4,5
#10
# 私有属性在类外无法改变
test1.__prv=11
test1.pr()
#3,4,5
#10
print(test1.__prv)
#11
# 相同类的不同实例,实例属性是不相关的
test2=TestClass(7,8,9)
print(test2.height)
#一般不建议在__init__()方法之外创建了初始化实例属性
# 一般不推荐类外定义和修改,修改可以单独定义方法
深入类的属性
1.当类属性与实例属性重名的时候:以实例名.属性名引用时,优先引用实例属性;以类名.属性名引用时,只能引用类属性
2.以字符串的形式来操作类的属性/方法的方式。
工具函数:hasattr(obj_name,"属性名"),是否具有某个属性
setattr(obj_name,"属性名","值"),getattr(obj_name,'"属性名")
3.属性包装:将方法包装成属性,以隐藏相关实现。控制属性的类型或范围;虚拟属性(由其它属性处理后得来)
三种属性操作(装饰器):可读:@property;可写:@<property-name>.setter;可删:@<property-name>.deleter
4.描述符:将实现特殊协议方法类作为另一个类的属性。用来拦截和控制属性访问并可以重复使用。
协议方法:__get__();__set__();__deleter__()
分类:数据描述符(实现全部协议方法);非数据描述符(实现部分协议方法);所有类成员函数都是非数据描述符。
5.__call__方法,让类的实例如函数一样可调用