类的内置方法(魔法方法)

类的内置方法(魔法方法)

凡是在类内部定义,以__ 开头__ 结尾的方法都是类的的内置方法,也称为魔法方法

类的内置方法,会在某种条件满足下自动触发

1、__ init__

在调用类时自动触发

2、__ new__

在 __ init __ 触发前自动触发,调用该类是,内部会通过__ new __ 产生一个新的对象

class Demo:
    # 在__init__触发前自动触发
    def __new__(cls, *args, **kwargs):
        print('__new__执行')
        # 内部会通过object产生一个新对象返回来触发__init__,如果此处未返回新对象,则不会触发__init__
        return object.__new__(cls, *args, **kwargs)

    def __init__(self):
        print('__init__执行')

obj = Demo()
# __new__执行
# __init__执行

3、__ getattr__

在通过 “ 对象 . 属性 ” 获取对象属性时,若没有该属性时触发

class Demo:
    # 在通过 “ 对象.属性 ” 获取对象属性时,若没有该属性时触发
    def __getattr__(self, item):
    	print('__getattr__执行')
    	print(item)
    	# 没有时默认返回None,可以设置默认返回值
    	return '设置的默认返回值'

obj = Demo()
print(obj.x)
# __getattr__执行
# x
# 设置的默认返回值

4、__ getattribute__

在通过 “ 对象.属性 ” 获取对象属性时,不管没有该属性,都会触发

**注意:当 __ getattr __ 和 __ getattribute __ 同时存在在类内部时,只会触发 __ getattribute __ **

class Demo:
    def __getattribute__(self, item):
        print('__getattribute__执行')
        print(item)
        # 不管有没有都是默认返回None,可以设置默认返回值
        return '设置的默认返回值'

        # 此处无法获取查找的属性值,不能通过对象.属性来查找属性值否则会造成递归导致程序崩溃
        # return self.__dict__[item]
        # return getattr(self, item)

obj = Demo()
obj.x = 10
print(obj.x) 
# __getattribute__执行
# x
# 设置的默认返回值

5、__ setattr __

当使用 “ 对象 . 属性 = 属性值” 时,添加或修改属性值时触发

class Demo:
        # 当使用 对象. 属性 = 属性值 时触发
    def __setattr__(self, key, value):
        print('__setattr__执行')
        print(key,value)
        #需要将添加或修改的属性加到对象名称空间中
        self.__dict__[key] = value

obj = Demo()
print(obj.__dict__)  # {}
obj.x = 10  # __setattr__执行/ x 10
print(obj.__dict__)  # {'x': 10}

6、__ call__

在调用对象,“ 对象()”时触发

class Demo:
    # 使用对象()调用对象时触发
    def __call__(self, *args, **kwargs):
        print('__call__执行')
        # 默认返回None,可以设置默认返回值
        return '设置默认值'

obj = Demo()
print(obj())
# __call__执行
# 设置默认值

7、__ str__

在打印对象时触发,必要要有一个 “ 字符串 ” 返回值

class Demo:
    def __str__(self):
        print('__str__执行')
        # 必须要有一个字符串返回值
        return '字符串'

obj = Demo()
print(obj)
# __str__执行
# 字符串

8、__ getitem__

在通过“ 对象[key]” 来获取属性值时触发

class Demo:
    def __getitem__(self, item):
        print('__getitem__执行')
        print(item)
        # 查找到value的值并返回,没有会报错,不写此步不管有没有都会返回None
        return self.__dict__[item]

obj = Demo()
obj.x = 10
print(obj['x'])
# __getitem__执行
# x
# 10

9、__ setitem__

在通过 “ 对象[key] = value ”设置属性时触发

class Demo:
    def __setitem__(self, key, value):
        print('__getitem__执行')
        print(key, value)
        # 需要将添加或修改的属性加到对象名称空间中
        self.__dict__[key] = value

obj = Demo()
print(obj.__dict__)  #{}
obj['x'] = 10
# __getitem__执行
# x 10
print(obj.__dict__) # {'x': 10}
posted @ 2019-11-29 19:22  Mr沈  阅读(352)  评论(0编辑  收藏  举报