python 类装饰器

类装饰器

propety

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

class Student:
    def __init__(self,name,birth):
        self.name = name
        self.birth = birth

    @property     # 将一个方法伪装成属性
    def age(self):
        import time
        return time.localtime().tm_year - self.birth
alex = Student('alex',1930)
print(alex.age)   # 名词

为什么要用property

将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

除此之外,看下

ps:面向对象的封装有三种方式:
【public】
这种其实就是不封装,是对外公开的
【protected】
这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
【private】
这种封装对谁都不公开

class Circle:
    def __init__(self,r):
        self.r = r

    @property
    def area(self):   # 面积更像是圆的属性
        return 3.14*self.r**2

    @property
    def perimeter(self): # 周长更像是圆的属性
        return 2*3.14*self.r

c = Circle(10)
print(c.area)
print(c.perimeter)

staticmethod

class Staticmethod_Demo():
    role = 'dog'

    @staticmethod
    def func():
        print("当普通方法用")

Staticmethod_Demo.func()


class Student:
    def __init__(self,name):
        self.name = name
    @staticmethod     # 声明login方法是一个静态方法 ,不必传任何默认的参数
    def login(flag):
        print('登录程序',flag)
        username = input('>>>')
        stu = Student(username)
        return stu
# 要想调用login 必须现有对象
# 要想创建对象 必须用户先输入名字
# 得调用登录之后才开始input

# 不必实例化就可以调用的login方法 不需要传递对象作为参数,就定义这个方法为静态方法
obj = Student.login(flag = True)  # 用类名可以直接调用这个方法了
print(obj.__dict__)

classmethod

class Manager:
    def __init__(self,name):
        self.name = name
    @classmethod     # 装饰当前这个方法为一个类方法,默认传参数cls,表示当前所在的类名
    def login(cls):
        username = input('>>>')
        stu = cls(username)
        return stu

obj = Manager.login()  # 用类名可以直接调用这个方法了
print(obj.__dict__)
posted @ 2019-09-14 13:31  Hyyyy  阅读(217)  评论(0编辑  收藏  举报