python 内建属性
在python中创建一个类,它不仅有我们自定义的属性和方法,还有与生俱来的一些属性和方法,我们叫它内建属性。
下面是类常用内建属性列表。
常用专有属性 | 说明 | 触发方式 |
---|---|---|
__init__ |
构造初始化函数 | 创建实例后,赋值时使用,在__new__ 后 |
__new__ |
生成实例所需属性 | 创建实例时 |
__class__ |
实例所在的类 | 实例.__class__ |
__str__ |
实例字符串表示,可读性 | print(类实例),如没实现,使用repr结果 |
__repr__ |
实例字符串表示,准确性 | 类实例 回车 或者 print(repr(类实例)) |
__del__ |
析构 | del删除实例 |
__dict__ |
实例自定义属性 | vars(实例.__dict__) |
__doc__ |
类文档,子类不继承 | help(类或实例) |
__getattribute__ |
属性访问拦截器 | 访问实例属性时 |
__bases__ |
类的所有父类构成元素 | 类名.__bases__ |
__init__:负责一个类实例化中的初始化操作
__new__:在创建实例化时发生作用,在__init__之前执行,主要作用是创建实例对象,典型的应用是在单利模式中.
class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): org = super(Singleton, cls) cls._instance = org.__new__(cls, *args, **kw) return cls._instance
__class__:是示例对象的属性,该属性指向了实例化该对象的类,代表实例化该对象的抽象类,可以通过它调用类的方法和类属性。
class Test: name = "抽象类" def __init__(self): self.name = '实例名字' def test(self): print('实例方法') test = Test() test.__class__.name # Out[21]: '抽象类' test.__class__.test(1) # 实例方法
__str__:实例化对象的字符串表示(代表名字),面向用户,通过print输出实例化类的结果
class Test: def __str__(self): return '这是实例化类的说明书' test = Test() print(test) # 这是实例化类的说明书
__repr__:实例化对象的字符串表示,面向开发者的
class Test: def __str__(self): return '用户可见' def __repr__(self): return '开发者可见' test = Test() print(test) # 用户可见 test # Out[30]: 开发者可见 在控制台输出实例化对象时的显示信息
__del__:当一个实例化对象被删除时,该方法将调用,该方法是执行删除对象的操作。
class Test: def __del__(self): print('我被删除了】') test = Test() del test # 我被删了
__dict__:类或实例化对象的属性字典
class Test: name = "抽象类" def __init__(self): self.name = '实例名字' def test(self): print('实例方法') test = Test() test.__dict__ Out[51]: {'name': '实例名字'} Test.__dict__ Out[52]: mappingproxy({'__dict__': <attribute '__dict__' of 'Test' objects>, '__doc__': None, '__init__': <function __main__.Test.__init__>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Test' objects>, 'name': '抽象类', 'test': <function __main__.Test.test>})
__doc__:是对函数/方法/模块所实现功能的简单描述,但当指向具体对象时,会显示此对象.
class Test: """我是说明书""" test = Test() test.__doc__ Out[60]: '我是说明书'
__getattribute__:属性拦截器,内部拦截修改某个属性的值
class Test: def __init__(self): self.name = '正常名字' def __getattribute__(self, name): return '拦截后名字' test = Test() test.name Out[63]: '拦截后名字'
__bases__:查询类的父类元素
class A: pass class B: pass class C(A, B): pass C.__bases__ Out[94]: (__main__.A, __main__.B)
内建属性一般是不建议修改,如果要修改那么尽量将整套的内建属性复写,否则容易出现错误。
文章出处:http://www.cnblogs.com/aaron-agu/
只有毅力和决心才能使人真正具有价值!