python基础之类中的特殊方法__xxx__()

对于定制化一个类来说,有些以__开头并结尾的方法是需要我们特殊对待的,因此我简单的回顾一下类中的几个常用的方法。

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__()")

本章属于简单回顾,难免有些错误 ,见者见谅!

你可能感兴趣的:(python基础知识回顾分析)