魔术方法
方法
__call__
方法
__call__
:可以让类的实例具有类似于函数的行为,进一步模糊了函数和对象之间的概念。
使用方式:对象后面加括号,触发执行。即:对象() 或者 类()()
class Person(object):
def __call__(self, *args, **kwargs):
print('call...')
p = Person() # 将Person()的内存地址赋值给person
p() # 内存地址() 输出:call...
如上代码所示,调用__call__时,并不需要person.__call__
。因为在person=Person()时,就已经将Person()的内存地址赋值给了person,所以后面调用时person本身就代表了那个内存地址,当成函数使用person()
__new__
方法
__new__
:创建对象,并分配内存
__init__
方法
__init__
:初始化对象。创建对象后第一个执行的方法。
__str__
方法
__str__
:打印对象的时候执行的方法。
class MyClass(object):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
obj = MyClass('马师傅')
print(obj) #此处输出为__str__的返回值:'马师傅'
__add__
方法
__add__
:两个对象相加的时候执行的方法。
class MyClass(object):
def __init__(self, value):
self.value = value
def __add__(self, other): # 如果没有这个方法,那最后一行代码执行会报错
return self.value + other.value
obj1 = MyClass(10.00)
obj2 = MyClass(11.00)
print(obj1 + obj2) # 输出为self.value + other.value的值:21.0
__del__
方法
__del__
:销毁对象的时候执行的方法。
class MyClass(object):
def __del__(self): # 销毁对象时执行,可以del obj主动执行,也可以在垃圾回收时自动执行
# 销毁对象 # 析构
print('del is running ...') # 此处可以做一些销毁对象前需要做的事情
obj1 = MyClass()
obj2 = MyClass()
del obj1 # 主动执行__del__方法
del obj2
__getitem__
方法
__getitem__
:使用[ ]操作对象的时候调用此方法。
换言之,一个对象没有__getitem__
方法就不能用[ ]操作。
class MyClass(object):
def __init__(self):
self.items = ['a', 'b', 'c']
def __getitem__(self, i):
return self.items[i]
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
__getattr__
方法
__getattr__
:当获得对象的属性,而对象无此属性时执行。
object类没有这个方法,如果不定义此方法,没有属性时会直接抛出异常。
class MyClass(object):
def __init__(self, value):
self.value = value
def __getattr__(self, item):
# __getattr__ 当获得对象的属性,而对象无此属性时执行
return '没有此属性'
obj = MyClass(1)
print(obj.value)
print(obj.name) # 没有此属性
__setattr__
方法
__setattr__
:设置属性时执行的方法
class MyClass(object):
def __init__(self, name):
self.name = name
def __setattr__(self, key, value):
print("setattr is running ....")
super().__setattr__(key, value)
obj = MyClass('zhang') # setattr is running ....
obj.name = 'li' # setattr is running ....
__delattr__
方法
__delattr__
:删除属性时执行的方法
class MyClass(object):
def __init__(self, name):
self.name = name
def __delattr__(self, item):
print("delattr is running ...")
super().__delattr__(item)
obj = MyClass('zhang')
del obj.name # delattr is running ...
print(obj.name) # 属性已被删除,这里会报错
属性
__bases__
属性
__bases__
: 就是一个元组,里面是继承的类
class A(object):
pass
class B(object):
pass
class MyClass(A, B):
pass
print(A.__bases__) # (<class 'object'>,)
print(MyClass.__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
obj = MyClass('Aaron', 18)
print(MyClass.__dict__)
'''
{'__module__': '__main__',
'a': 0,
'__init__': <function MyClass.__init__ at 0x00000170ECA28168>,
'get_name': <function MyClass.get_name at 0x00000170ECA2C5E8>,
'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__doc__': None}
'''
print(obj.__dict__) # {'name': 'Aaron', 'age': 18}
__slots__
属性
__slots__
:覆盖 __dict__中的属性,限制对象的属性只能有这些。可以节省内存。
class MyClass(object):
__slots__ = ['age','name']
def __init__(self, name,x):# __slots__中没有x,则此处给x赋值会报错
self.name = name
obj = MyClass('aaaa',1)
obj2 = MyClass('bbb',1)
print(obj.__slots__)
print(MyClass.__dict__)