__init__ 和 __new__的区别
# __new__ : 创建对象 Create and return a new object. # __init__ : 初始化对象 class MyClass(object): def __init__(self): print("init is running ...") def __new__(cls, *args, **kwargs): # 创建对象 # 分配内存 print("new is running ...") obj = super().__new__(cls) # 创建对象 return obj
__call__方法
实现一个对象像函数一样被调用
例如函数自带call属性,能够直接调用:add(1,2)
def add(x, y): return x + y print(dir(add)) 结果: ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
__str__方法
print(obj)原来返回的是一个对象,现在用str方法可以自定义一个返回值,print的时候打印返回的值
class MyClass(object): def __init__(self, name): self.name = name def __str__(self): print("---str is running---") return self.name # return '1' def main(): obj = MyClass('马师傅') print(hasattr(obj, '__str__')) # 以下三种方式可以触发__str__ print(obj) # return self.name返回 马师傅;return '1'返回 1 str(obj) format(obj) if __name__ == '__main__': main() 结果: True ---str is running--- 马师傅 ---str is running--- ---str is running---
__repr__方法
如果没有__str__方法,就会触发__repr___
class MyClass(object): def __init__(self, name): self.name = name # def __str__(self): # print("---str is running---") # return self.name # # return '1' def __repr__(self): print("---repr is running---") return self.name # return '1' def main(): obj = MyClass('马师傅') print(hasattr(obj, '__str__')) # 以下三种方式可以触发__str__ print(obj) # return self.name返回 马师傅;return '1'返回 1 str(obj) format(obj) if __name__ == '__main__': main() 结果: True ---repr is running--- 马师傅 ---repr is running--- ---repr is running---
__add__方法
class MyClass(object): def __init__(self, value): self.value = value def __add__(self, other): return self.value + other.value def main(): a = [1, 2] b = [3, 4] print(a + b) obj1 = MyClass(10.00) obj2 = MyClass(11.00) print(obj1 + obj2) print(hasattr(a, '__add__')) if __name__ == '__main__': main() 结果: [1, 2, 3, 4] 21.0 True
__getitem__方法
有__getitem__方法的对象才能用[]操作
class MyClass(object): def __init__(self): self.items = ['a', 'b', 'c'] # 有__getitem__方法的对象才能用[]操作 def __getitem__(self, i): return self.items[i] if __name__ == '__main__': obj = MyClass() print(obj[0]) # a print(obj[1]) # b print(obj[2]) # c print(hasattr(tuple, '__getitem__')) # True print(hasattr(1, '__getitem__')) # False print(hasattr(dict, '__getitem__')) # True print({'name': 'xxx'}['name']) 结果: a b c True False True xxx
__getattr__方法
class MyClass: def __init__(self,name): self.name = name # __getattr__ 当获得对象的属性,而对象无此属性时执行 def __getattr__(self, item): return 999 myclass = MyClass("Tom") print(myclass.name) print(myclass.age) 结果: Tom 999
__bases__方法
__bases__: 就是一个元组,里面是继承的类
class A(object): pass class B(object): pass class MyClass(A, B): pass if __name__ == '__main__': print(MyClass.__bases__) # __bases__: 就是一个元组,里面是继承的类 结果: (<class '__main__.A'>, <class '__main__.B'>)
__dict__方法
__dict__方法可以把属性取出来
类取出类的属性,对象取出对象的属性
class MyClass(object): # MyClass 是类 , 类 其实就是 定义如何创建对象的一段代码 a = 0 # 类变量 (归属于类) def __init__(self, name, age): temp = 1 # 局部变量 self.name = name # self 是对象 self.age = age # name ,age 实例变量(归属于对象) def get_name(self): return self.name if __name__ == '__main__': obj = MyClass('Tom', 100) print(MyClass.__dict__) print(obj.__dict__) 结果: {'__module__': '__main__', 'a': 0, '__init__': <function MyClass.__init__ at 0x00000213456FF940>, 'get_name': <function MyClass.get_name at 0x00000213456FFC10>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None} {'name': 'Tom', 'age': 100}