python面向对象:装饰器

@property

Java里面是属性都是私有的,获取或修改属性需要通过getter,setter来实现。
Python 中的@property装饰器就是为了实现Java中的这一功能。

  1. 这些属性不要定义在__init__
  2. 单独定义一个被@property修饰的函数。
class WeChat:

  @property
  def score(self):
      return self._score
>>> w = WeChat()
>>> w.socre 

此时运行会抛异常,因为self._score没有定义。所以我们还需要定义一个设置值的函数。

  1. 设置值的函数
  • 这么写的好处在于,可以在这做一些校验,以便保证程序属性符合预期。
  • 另外注意,@property和@score.setter修饰的这两个函数需要同名
  • @score.setter修饰的这个函数可以传值
@score.setter
def score(self,value):
  self._score = value

@staticmethod / @classmethod

  • 定义
    @staticmethod是静态方法,一般把跟类有关的功能但是不需要实例化的方法,设置为静态方法。
    @classmethod是类方法,一般把一些只在类中运行而不在实例中运行的方法设置为类方法。
  • 使用
    @staticmethod不需要表示自身对象的self和自身类的cls参数,定义时和函数一样。如果在静态方法中需要调用这个类的一些属性和方法,只能通过类名.属性名/类名.方法名。
    @ classmethod不需要self参数,但是需要cls参数来表示自身类。类方法可以把cls当作self来使用,像self一样调用类的属性、方法。但是必须注意的是,调用类方法时是cls().method, 不是使用cls.method
class A:
    bar = 1

    def foo(self):
        print('foo')

    @staticmethod
    def static_foo():
        print('static_foo', A.bar)

    @classmethod
    def class_foo(cls):
        print('class_foo', cls.bar)
        cls().foo()


if __name__ == '__main__':
    A.static_foo()
    A.class_foo()
  • 为什么要使用静态方法和类方法?
    静态方法和类方法,都可以在类的外部写个函数解决,但是这样会造成类内部代码的扩散,造成维护困难

@abstractmethod

使用 @abstractmethod 可以使得 Python 也能像静态语言一样定义接口
继承 abc.ABC 的父类中被 @abstractmethod 修饰的方法,在子类中被强制要求重写。如果不重写,在编译器加载的时候就会发生异常。

import abc

# abstrctmethod is similar with Java interface
class Father(abc.ABC):
    """
    father class must inherit abc.ABC
    """
    @abc.abstractmethod
    def test_this_method(self):
        print('i just want to check this method how to use')

class Son(Father):
    """
    if son class don't implement the abstractmethod,
    when call father method,it will trigger typeError.
    """
    def test_this_method(self):
        print('i implement father\'s method.---good son!')

你可能感兴趣的:(python面向对象:装饰器)