@property
Java里面是属性都是私有的,获取或修改属性需要通过getter,setter来实现。
Python 中的@property
装饰器就是为了实现Java中的这一功能。
- 这些属性不要定义在
__init__
中 - 单独定义一个被
@property
修饰的函数。
class WeChat:
@property
def score(self):
return self._score
>>> w = WeChat()
>>> w.socre
此时运行会抛异常,因为self._score
没有定义。所以我们还需要定义一个设置值的函数。
- 设置值的函数
- 这么写的好处在于,可以在这做一些校验,以便保证程序属性符合预期。
- 另外注意,@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!')