一. 魔术方法总结
1.__str__,__repr__,__call__,__dir__,__dict__的使用
# 定义一个全局变量
m = 5
class Student(object):
class_name = "3班"
def desc(self):
pass
@staticmethod
def mod_class(cls):
pass
def __str__(self):
"""
使用print(self),或者str(self)时
:return:
"""
print("zhishi str")
return "javk"
def __repr__(self):
"""
__str__不存在时才调用
:return:
"""
print("jack")
return "mm"
def __call__(self):
"""
使用self()调用
:return:
"""
print("这是call方法")
a = Student()
# 使用print打印对象的时候实际是:print(a__str__()),若是没有__str__()就调用__repr__()
print(a) # 输出结果: zhishi str \n javk
# a()等同于a.__call__()
a() # 输出结果:这是call方法
# __dir__()方法是输出对象中所有的属性名和方法名称,也可以这样调用 dir(self)
a.name = "老王"
print([i for i in a.__dir__() if not i.startswith("_")]) # 输出结果:['name', 'class_name', 'desc', 'mod_class']
print(a.__dir__()) # 输出结果:包括魔术方法在内的 ,等同于:print(dir(a))
# __dict__属性:返回对象内部的所有属性和属性值
a.name = "老王"
print(a.__dict__) # 输出结果:{'name': '老王'}
- __setattr__,__getattr__,__getattribute__的使用
class Student(object):
class_name = "3班"
def __init__(self, name,age):
self.name = name
self.age = age
def desc(self):
pass
def __setattr__(self, key, value):
if key == "info":
self.name,self.age = value
else:
self.__dict__[key] =value
def __getattr__(self, item):
"""
__getattr__方法的自动执行,需要满足两个条件:一是访问对象属性;二是触发AttributeError异常
:param item:
:return:
"""
if item == "info":
return "学生姓名是:" + self.name + "学生年龄是:" + str(self.age)
print("jack")
def __getattribute__(self, item):
"""
获取属性值时,首先调用当前方法,方法不存在时调用__getattr__()
:param item:
:return:
"""
if item == "info":
return "学生姓名是:" + self.name + "学生年龄是:" + str(self.age)
else:
return object.__getattribute__(self, item)
st1 = Student("张三", 25)
st1.info = ("李四",58)
print(st1.info) # 输出结果:学生姓名是李四学生年龄是58
print(st1.name) # 输出结果:李四
# 访问不存在的属性,首先调用__getattribute__方法(如果该方法未定义,会调用基类的__getattribute__方法),触发AttributeError异常并自动捕获,然后才调用__getattr__方法。
st1.mm # 输出结果:jack