zoukankan      html  css  js  c++  java
  • 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__() #两种方法都可以效果一样
  • 相关阅读:
    绿色版的Linux.NET——“Jws.Mono”
    警惕!高版本VS发布时预编译导致Mono中Razor找不到视图
    用迭代实现无限级分类
    如何让我们的PHP在Jexus中跑起来
    Linux.NET实战手记—自己动手改泥鳅(下)
    umei-spider
    selenium-爬取小说
    filter() 函数
    字典,元组,列表,字符串互相转换
    Python实用黑科技——解包元素(2)
  • 原文地址:https://www.cnblogs.com/jzxs/p/11413994.html
Copyright © 2011-2022 走看看