module
表示当前操作的对象在哪个模块,即所在包的包名,若不在包中,则为”main“。
| 12
 3
 4
 
 | from A.B import C
 c = C()
 print(c.__module__)
 
 | 
class
表示当前操作的对象的类是什么。
| 12
 3
 4
 
 | from A.B import C
 c = C()
 print(c.__class__)
 
 | 
init ,del
__init__:构造方法,通过类创建对象时,自动触发执行。
__del__:析构方法,当对象在内存中被释放时,自动触发执行
创建对象后,Python 解释器默认调用 init 方法。当删除一个对象时,Python 解释器也会默认调用 del 方法。
一般情况下,创建了一个类的对象之后,如果该对象在之后的代码中不会被调用,那么 python 的内存管理机制会自动删除它。
| 12
 3
 4
 5
 6
 7
 
 | class A:def __init__(self):
 print('init')
 def __del__(self):
 print('del')
 
 a = A()
 
 | 
call
call() 允许一个类的实例像函数一样被调用。看如下例子:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | class A:def __init__(self, a, b) -> None:
 self.a = a
 self.b = b
 
 def __call__(self):
 print(self.a, self.b)
 
 a = A(1, 2)
 a()
 
 | 
实质上说,这意味着 a() 与 a.call() 是相同的。
dict
类名.__dict__:查看类中的所有成员。
对象.__dict__:查看对象中的所有成员。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | class A:a = 1
 b = 2
 def __init__(self, a, b) -> None:
 self.a = a
 self.b = b
 self.x = self.add
 
 def add(self):
 return self.a + self.b
 
 a = A(1, 2)
 print(a.__dict__)
 
 
 print(A.__dict__)
 
 
 | 
str
如果一个类中定义了__str__ 方法,那么在打印对象时,默认输出该方法的返回值。
| 12
 3
 4
 5
 6
 
 | class A:def __str__(self) -> str:
 return "hello world"
 
 a = A()
 print(a)
 
 | 
getitem__,__setitem__,__delitem
使得对象能够以字典的方式获取、设置、删除数据。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | class A:def __init__(self) -> None:
 self.dic = {
 'name': 'silence',
 'age': 22
 }
 
 def __getitem__(self, key):
 return self.dic[key]
 
 def __setitem__(self, key, value):
 self.dic[key] = value
 
 def __delitem__(self, key):
 del self.dic[key]
 
 a = A()
 
 print(a['name'])
 
 a['sex'] = 'male'
 
 del a['age']
 
 | 
getattr__,__setattr
python 提供了诸多的魔法方法,比如 getattr 可以将其他类中的属性为自己所用,setattr 允许向对象中添加属性。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | class B:@classmethod
 def add(cls, a, b):
 return a+b
 
 class A:
 def __init__(self) -> None:
 self.a = B()
 
 def __getattr__(self, name):
 return getattr(self.a, name)
 
 def __setattr__(self, __name: str, __value) -> None:
 self.__dict__[__name] = __value
 
 a = A()
 print(a.add(1, 2))
 
 a.x = 10
 print(a.x)
 
 | 
我们先在 A 类的初始化函数中实例化一个 B 类的对象 a,然后将 a 作为 getattr 方法的参数,那么当执行 a.add(1, 2) 时,发现 A 类中并没有这个属性,这时就会自动调用 getattr 方法,从对象 a 对应的类 B 中调用 add 方法。
注意:getattr 方法一定是在本类中找不到属性时才会调用。
setattr 方法通过 dict 实现。因为对象的属性都保存在 dict 中,那么通过向 dict 中添加属性就可以实现向对象中添加属性。