对于定制化一个类来说,有些以__开头并结尾的方法是需要我们特殊对待的,因此我简单的回顾一下类中的几个常用的方法。
class Test(object):
cls_name = "bug_ming"
""" The most base type """
def __delattr__(self, attribute, *args, **kwargs): # real signature unknown
"""
Implement delattr(self, name).
当删除某一个实例对象的属性时,触发__delattr__方法的执行,利用此特点我们可以提醒用户做了哪些操作
"""
print("this is __delattr__()")
super().__delattr__(attribute)
def __getattribute__(self, attribute): # real signature unknown
"""
Return getattr(self, name).
当打印实例化对象的某些属性时触发__getattribute__()
每次引用属性或方法名称时都会触发__getattribute__(),并将该属性或方法名返回给引用处
而正是由于每次引用属性的时候都会经过此方法,那么此方法可以看做是一个过滤器,用来控制用户的某些行为
"""
print("this is __getattribute__()")
if attribute == "age":
return "You have no right to do that"
elif attribute is None:
raise AttributeError
else:
return object.__getattribute__(self, attribute)
def __getattr__(self, item):
"""
如果访问一个实例化对象的属性,而这个对象的属性并不存在,则会访问这个__getattr__()方法
而我们自定义一个类的时候,如果想访问某个属性,而这个属性不存在,则经过此方法,可以在此方法中定义raise引发异常
"""
print("this is __getattr__()")
raise AttributeError
def __init__(self, name): # known special case of object.__init__
"""
Initialize self. See help(type(self)) for accurate signature.
当实力化对象的时候调用__init__()方法,用这个方法给对象封装属性
如果没有要封装的属性,只是单纯的生成一个对象,类中是不需要写此方法的,实际执行的是父类中的__init__()方法
而且实例化对象的时候是必须要有__init__()的,即使你定义的所有类中都没有__init__(),那么也会是object的__init__()
不过一般情况下是本类中定义__init__(),父类中并不定义此方法
如果父类和子类中都有__init__()方法,那么在子类中必须使用super来调用父类中的__init__()方法,并正确的使用参数
print("this is __init__()")
"""
self.name = name
@staticmethod # known case of __new__
def __new__(cls, *more): # known special case of object.__new__
"""
Create and return a new object. See help(type) for accurate signature.
当实例化对象的时候,会触发__new__()方法
正是因为如此,那么我们可以利用__new__()方法,在这个方法内限定用户创建对象的数量,例如单例模式
真正产生对象的空间地址的这个操作是用C语言编写的接口,如果没有C语言的功底就不要真正重写__new__()方法了
我们重写了此__new__()方法,也只不过是在该方法内加了一些限制罢了,底层的还是用的object的__new__()
"""
print("this is __new__()")
return super().__new__(cls)
def __repr__(self, *args, **kwargs): # real signature unknown
"""
Return repr(self).
当打印实例化出来的对象的时候触发__repr__()方法
"""
print("this is __repr__()")
return "这里是Test类的一个实例化对象"
def __setattr__(self, *args, **kwargs): # real signature unknown
"""
Implement setattr(self, name, value).
当实例化对象的时候如果需要给给对象封装一些属性,则触发该方法,用该方法给对象封装属性
调用object中的方法给对象封装属性,底层的C语言写的
每次给实例化的对象封装属性的时候就会触发__setattr__()方法
这个方法并没有返回值,只是执行了一些操作
"""
print("this is __setattr__()")
# object.__setattr__(self, *args, **kwargs) # 当本类直接继承于object时可以这样写
super().__setattr__(*args, **kwargs)
def __str__(self, *args, **kwargs): # real signature unknown
"""
Return str(self).
# 当打印类实例化出来的对象时触发__str__()方法
"""
print("this is __str__()")
# return "我这里是Test类的一个实例化对象"
super().__str__()
def __call__(self, *args, **kwargs):
"""
对象名加上括号后就会触发__call__()的执行
实际上此方法是将对象名当做一个函数来执行,从另一方面看函数也是可以看做是一个对象的,
也正是印证了在Python中一切皆对象的思想
"""
print("this is __call__()")
本章属于简单回顾,难免有些错误 ,见者见谅!