一、__doc__
"""This is the module docstring""" class TestDoc: """类测试""" def demo(self): """方法注释""" pass if __name__ == '__main__': print(__doc__) print(TestDoc().__doc__) print(TestDoc().demo.__doc__) print(TestDoc().__class__.__name__) #类名获取,方法名也可以用 方法名.__name__ 方式拿到名字
二、__name__
def test_123(): if __name__ == '__main__': print("自己被执行") else: print("被别人执行") test_123() #执行结果是:自己被执行
from test import test_123 test_123() #执行结果是:被别人执行 # 被别人执行
三、__dict__
class A(object): """ Class A. """ a = 0 b = 1 def __init__(self): self.a = 2 self.b = 3 def test(self): print( 'a normal func.') @staticmethod def static_test(self): print( 'a static func.') @classmethod def class_test(self): print( 'a calss func.') obj = A() print (obj.__dict__)
#{'a': 2, 'b': 3} for k,v in A.__dict__.items(): print({k:v}) # {'__module__': '__main__'} # {'__doc__': ' Class A. '} # {'a': 0} # {'b': 1} # {'__init__': <function A.__init__ at 0x000001F37A39AD08>} # {'test': <function A.test at 0x000001F37A39AD90>} # {'static_test': <staticmethod object at 0x000001F37A3A1080>} # {'class_test': <classmethod object at 0x000001F37A3A10B8>} # {'__dict__': <attribute '__dict__' of 'A' objects>} # {'__weakref__': <attribute '__weakref__' of 'A' objects>}
# 我的理解是:类、类的实例才有dict
四、__getattr__、__getattribute__、__get__
- 如果定义了
__getattribute__
,那么无论访问什么属性,都是通过这个函数获取,包括方法,t.f()
这种也是访问的这个函数,此时这个函数应该放回一个方法,如果像例子中,仍然返回一个数字,你会获得一个TypeError: 'int' object is not callable
错误 - 只要定义了
__getattribute__
方法,不管你访问一个存在的还是不存在的属性,都由这个方法返回,比如访问t.a
,虽然a存在,但是只要定义了这个访问,那么就不是访问最开始的a了 - 如果
__getattribute__
抛出了AttributeError
异常,并且定了了__getattr__
函数,那么会调用__getattr__
这个函数,不论这个属性到底是不是存在 - 也就是说属性访问的一个大致优先级是:
__getattribute__
>__getattr__
>__dict__
参考来源;https://www.cnblogs.com/andy1031/p/10923834.html
五、__new__
__new__方法的第一个参数是类,而其余的参数会在调用成功后全部传递给__init__方法初始化