hasattr,getattr和setattr

# 我们用 hasattr() 函数判断指定属性(或方法)是否存在,
# 但到底是属性还是方法,则需要进一步判断它是否可调用。
# 程序可通过判断该属性(或方法)是否包含 __call__ 属性来确定它是否可调用

class User:
    def __init__(self, name, passwd):
        self.name = name
        self.passwd = passwd
    def validLogin (self):
        print('验证%s的登录' % self.name)       
u = User('crazyit', 'leegang')
# 判断u.name是否包含__call__方法,即判断是否可调用
print(hasattr(u.name, '__call__')) # False

# 判断u.passwd是否包含__call__方法,即判断是否可调用
print(hasattr(u.passwd, '__call__')) # False

# 判断u.validLogin是否包含__call__方法,即判断是否可调用
print(hasattr(u.validLogin, '__call__')) # True

'''对于 name、 passwd 两个属性,由于它们都是不可调用的,
因此程序在判断它们是否包含 __call__ 方法时输出 False;
对于 validLogin 方法,由于它是可调用的,
因此程序在判断它是否包含 __call__  方法时输出 True。
实际上,一个函数(甚至对象)之所以能执行,关键就在于 __call__() 方法。
实际上 x(arg1, arg2,...) 只是 x.__call__(arg1, arg2, ...) 的快捷写法,
因此我们甚至可以为自定义类添加 __call__ 方法,从而使得该类的实例也变成可调用的。'''

# 定义Role类
class Role:
    def __init__ (self, name):
        self.name = name
    # 定义__call__方法
    def __call__(self):
        return self.name
r = Role('管理员')
# 直接调用Role对象,就是调用该对象的__call__方法
print(r())


def foo ():
    print('--foo函数--')
# 下面示范了2种方式调用foo()函数
foo()
foo.__call__() #两种方法都可以效果一样

 

转载于:https://www.cnblogs.com/jzxs/p/11413994.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值