1.什么是魔法函数
a.类自带的以双下划线开头和结束的方法
b.一般不需要主动调用,由特定的方法或行为触发
c.可以通过魔法函数控制类的行为,实现对类的高级控制
d.常见的魔法函数如__init__
2.__repr__:定制对象显示规则
3.__del__:定制对象的析构方法
4.__new__:负责创建类的实例
a.__new__和__init__的区别: __new__负责创建类的实例,__init__负责初始化类的实例
b.创建类的实例时,先调用__new__,再调用__init__
c.__init__初始化类的实例是由__new__方法传递过来的,也就是这里的self
d.可以用来实现类的单例模式:用类的一个属性保存已经创建的实例
class Student:
def __new__(cls, *args, **kwargs):
print('__new__')
return object.__new__(cls) # 调用父类的__new__方法
def __init__(self):
print('__init__')
s = Student()
'''
__new__
__init__
'''
class NewInt(int):
def __new__(cls, value):
return int.__new__(cls, abs(value))
a = NewInt(-4.56)
print(a)
'''
4
'''
5.通过魔法函数对属性进行管理
a.__dir__():查看对象的方法和属性的名字
b.dir():一个函数,对__dir__方法返回值进行排序,并包装为列表
c.__dict__是一个字典,有如下特性
i.当作用于类时,存储所有实例共享的变量和函数,不包含实例属性
ii.当作用于对象时,存储该对象所有的属性和值(包含私有属性)
iii.一般用于动态读取和设置对象的属性
6.attr相关魔法函数
a.__getattribute__(self, xxx):访问对象的任意属性时被自动调用
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __getattribute__(self, item):
return super().__getattribute__(item)
stu = Student('zhangsan', 18)
print(stu.name)
'''
zhangsan
'''
b.getattr(self, xxx):访问对象的xxx属性且该属性不存在时被调用
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __getattribute__(self, item):
print(f'访问了 {item} 属性')
return super().__getattribute__(item)
def __getattr__(self, item):
print(f'调用了 __getattr__ 方法')
stu = Student('zhangsan', 18)
print(stu.abc)
'''
访问了 abc 属性
调用了 __getattr__ 方法
None
'''
c.__setattr__(self, xxx):当对xxx属性赋值时被调用
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __setattr__(self, key, value):
self.__dict__[key] = value
print(f'将 {key} 的值设置为 {value}')
stu = Student('zhangsan', 18)
stu.age = 20
'''
将 name 的值设置为 zhangsan
将 age 的值设置为 18
将 age 的值设置为 20
'''
d.__delattr__(self, xxx):当删除对象的xxx属性时被调用
7.反射
a.通过字符串的形式在运行时动态修改程序的变量、方法及属性的操作。注意,对于反射操作中所有的修改都会在内存中进行,所以它并不会修改实际代码。主要目的是提高代码在运行时的灵活性
b.hasattr:输入一个字符串,判断对象有没有这个方法或属性
c.getattr:获取对象属性或方法的引用。如果是方法,则返回方法的引用;如果是属性,直接返回属性值。如果属性或方法不存在,则抛出异常
d.setattr:动态添加一个方法或属性
e.delattr:动态删除一个方法或属性