目录
1.@staticmethod
2.@classmethod
3.@abstractmethod
4.@property
装饰器应用场景
修饰类方法,静态方法。不传入代表实例对象的self参数,并且不强制要求传递任何参数,可以被类直接调用。静态方法是独立于类的一个单独函数,只是寄存在一个类名下。
静态方法就是类对外部函数的封装,有助于优化代码结构和提高程序的可读性。
class Test:
def __init__(self,num):
self.num = num;
def cout_num(self):
print(self.num)
@staticmethod
def print_num():
print("Hello World")
if __name__ == "__main__":
obj = Test(10)
"""实例化成员方法"""
obj.cout_num()
"""直接访问静态方法"""
Test.print_num()
"""实例化 访问静态方法"""
obj.print_num()
修饰类方法。不传入self示例本身,而是传入cls,代表这个类自身,可以来调用类的属性,类的方法,实例化对象等。类方法是将类本身作为操作对象。当我们需要和类直接进行交互,而不需要和实例进行交互时,自然也就不需要传入实例本身。
class A(object):
num = 1
def func1(self):
print('func1')
@classmethod
def func2(cls):
print('func2')
print(cls.num)
cls().func1()
if __name__ == '__main__':
A.func2()
------------------------------
>>> func2
>>> 1
>>> func1
抽象方法。用于程序接口的控制。含有abstractmethod 方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的不重写。
import abc
class Set(metaclass=abc.ABCMeta):
def __int__(self,value):
self.value = value
@abc.abstractmethod
def config(self):
"""
an abstract method need to be implemented
"""
#子类
class Mode(Set):
def config(self,value): #必须重写这个方法
return value
将一个方法伪装成属性。被修饰的特性方法,内部可以实现处理逻辑,但对外提供统一的调用方式(访问方式很友好),实现一个示例属性get、set、delete三种方法的内部逻辑。
-只有@property表示 只读 。
-同时有@property和@*.setter表示 可读可写 。修改属性
-同时有@property和@*.setter和@*.deleter表示可读可写可删除属性。
例1:
class Cimer(object): #需继承父类object,否则property等无法生效
def __init__(self, value = 0.0):
self._time = value
self._unit = 's'
# 使用装饰器的时候,需要注意:
# 1. 装饰器名,函数名需要一致
# 2. property需要先声明,再写setter,顺序不能倒过来
@property
def time(self): # 相当于time属性的getter方法
return str(self._time) + ' ' + self._unit
@time.setter
def time(self, value):
if(value < 0):
raise ValueError('Time cannot be negetive.')
self._time = value
t = Cimer()
t.time = 1.0
print(t.time)
例2:
class MyClass(object):
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
self._value = value
@value.getter
def value(self):
return self._value
@value.deleter
def value(self):
del self._value
c1 = MyClass(10)
print(c1.value) # 10
c1.value = 20
print(c1.value) # 20
del c1.value # _value成员被删除
print(c1.value) # 报_value不存在的错误