python中setattr(),getattr(),hasattr()函数的使用

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方法

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值