day8_类的装饰器和反射

"""
类的装饰器:
    @property
    当类的函数属性声明 @property后, 函数属性不需要加括号 即可调用
    @staticmethod
    当类的函数属性声明 @staticmethod后, 把函数属性声明为静态属性, 不能直接访问类属性与实例属性
    @classmethod
    当函数属性声明 @classmethod后,把函数属性声明为类属性,不能直接访问实例属性,类可以直接调用

"""
class A():
    q = "清华大学"
    def __init__(self):
        self.name = "不忘初心,方缘继续努力ing"
        self.oh = 666
    @property
    def  add(self):
        print(self.name)
        return 1+1

    @staticmethod
    def result(para):
        # para()是一个对象
        print(para().add)  # 函数属性声明为静态属性时,不能直接访问类属性和实例属性
        print(para.add)
        return 3*3

    @classmethod
    def clas(cls):
        # print(cls.oh)    # 函数属性声明为类属性时,不能直接访问实例对象,但可以访问类属性
        print(cls.q)     # q为类A的静态属性
# 调试程序
if __name__ == "__main__":
    # 创建类A的对象(实例)data
    data = A()
    # 参数A是一个类
    A.result(A)
    # 函数属性不用加括号
    print(data.add)
    data.clas()

# 打印对象的属性字典
对象 = A()
print(对象.__dict__)

 

"""
反射:
    hasattr(obj, str)   返回布尔值,  当str存在于 obj时,返回true, 否则返回false
    getattr(obj, str)   返回str的内存地址
"""
class He():
    # pass
    def interface(self,user,passwd):
        if user == "belief" and passwd == "123":
            return 1    # 等效于return True
        else:
            error = "账号或密码错误!!!"
            return error

class I():
    def login(self):
        if hasattr(He,"interface"):
            user = input("用户名>>>:")
            passwd = input("密码>>>:")
            func = getattr(He,"interface")
            data = func(self,user,passwd)
            if data == 1:     # 等效于if data == True
                print("这是一个完美的登陆界面!!!")
            else:
                print(data)
        else:
            print("他去旅游了,还没回来敲代码!!!")

    def index(self):
        print("登陆成功后执行我")

if __name__ == "__main__":
    i = I()
    i.login()

  

posted @ 2019-07-13 15:55  方缘  阅读(187)  评论(0编辑  收藏  举报