1. python的__dict__
python中万物皆对象,基本只要是对象就会存在__dict__,不过部分对象除外,比如int,str,list这种内置的数据类型就没有__dict__
__dict__还存在于类实例和类属性中,虽然存在,但是两者存储东西不一致
类属性中存在的__dict__主要存放的静态函数、类函数、普通函数、全局变量以及一些内置的属性
类实例中存在的__dict__主要存放的是类实例中相关的变量等属性
class A(object):
a = 1
b = 2
def __init__(self,a,b):
self.a = a
self.b = b
def print_func_name(self):
print("class __name__",self.__class__.__name__)
def __call__(self, *args, **kwargs):
print("test __call__")
if __name__ == '__main__':
a = A(3,4)
print(A.__dict__)
print(a.__dict__)
A.__dict__:{'__init__': <function A.__init__ at 0x0000026159BD58C8>, '__module__': '__main__', 'print_func_name': <function A.print_func_name at 0x000002615CC2C950>, '__weakref__': <attribute '__weakref__' of 'A' objects>, 'b': 2, '__doc__': None, '__call__': <function A.__call__ at 0x000002615CC2C9D8>, '__dict__': <attribute '__dict__' of 'A' objects>, 'a': 1}
a.__dict__:{'b': 4, 'a': 3}
2. python的__call__
__call__是python类中一个特殊的实例方法,类似于在类中重载 () 运算符,可以是类实例像普通函数一样,以 函数名() 使用
a = A(11,33)
a()
类中类属性没有__call__,类方法是可调用对象,因此它有 __call__方法。
3. python的__class__
类实例的__class__会指向该实例对象对应的类,由此之后可以由类去调用其他的类属性