1. hasattr(object, name)
描述:用来判断对象object中是否含有名为name的属性(属性或者方法),如果有则返回True,如果没有返回False
注意:name参数是字符串格式。
class A:
age = 18
def func(self):
return "这是A类里面的func方法"
print(hasattr(A, 'age')) 打印结果: True
print(hasattr(A, 'func')) 打印结果: True
print(hasattr(A, 'height')) 打印结果: False
下面我们来个实际运用(可能用到单例模式和魔法函数的知识点,看不懂的小伙伴们可以跳过)。
1、通过装饰器实现单例模式,只要任意一个类使用该装饰器装饰,
那么就会变成一个单例模式的类。(面试真题)
------------------函数实现------------------
def single(cls):
def wrapper(*args, **kwargs):
if not hasattr(cls, '__instance'):
cls.__instance = cls(*args, **kwargs)
return cls.__instance
return wrapper
-------------------类实现------------------
class single:
__instance = None
def __init__(self, cls):
self.cls = cls
def __call__(self, *args, **kwargs):
if not hasattr(self.cls, '__instance'):
self.cls.__instance = self.cls(*args, **kwargs)
return self.cls.__instance
@single # A= single(A)
class A:
pass
a = Musen()
b = Musen()
print(a)
print(b)
2. setattr(object, name, value)
描述:用来给对象object的name属性重新赋值为value,如果这个对象的name属性不存在的话,那么就会给这个对象新生成一个属性name,并且把value值赋给这个新生成的属性name
class A:
age = 18
def func(self):
return "这是A类里面的func方法"
a = A()
setattr(A, 'age', 99)
print(a.age) 打印结果: 99
setattr(A, 'weight', 170)
print(a.weight) 打印结果: 170
3. getattr(object, name[, default])
描述:用于返回一个对象属性值,object是对象,name是属性,default是默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
class A:
age = 18
def func(self):
return "这是A类里面的func方法"
print(getattr(A, 'age')) 打印结果: 18
print(getattr(A, 'height')) 打印结果: AttributeError: type object 'A' has no attribute 'height'
print(getattr(A, 'name', 999)) 打印结果: 999, 如果对象没有这个name属性,给他一个默认返回值,即是999;
print(getattr(A, 'age', 520)) 打印结果: 18, 如果对象没有这个age属性,给他一个默认返回值,即是520;如果该对象有这个age属性,则还是返回的是原来的值 而不是默认值520
注意:如果给定的name是类的方法名的话,那么返回的值 是函数对象,那么此时需要调用函数对象来获取返回值,类似于func(),后面加个括号即可。这里要注意的是,如果是实例函数的话,不能写getattr(A, 'func')(),会报错TypeError: func() missing 1 required positional argument: 'self'。因为不能直接用A这个类名去调用实例方法,可以考虑创建这个类的对象A(),然后直接再去调用他getattr(A(), 'func')()
class A:
age = 18
def func(self):
return "这是A类里面的func方法"
getattr(A, 'func')() 报错: TypeError: func() missing 1 required positional argument: 'self'
print(getattr(A(), 'func')()) 打印结果: 这是A类里面的func方法