@property
功能:将方法转变为属性调用
场景:为避免对类属性的直接访问和修改,使用此装饰器实现getter和setter方法,而不用在调用方法实现对属性的修改,可以直接使用属性设置,安全方便
实例:
class Person(object):
def __init__(self,name,age):
self._name=name
self._age=age
@property #实现了一个关于age的getter方法
def age(self):
return self._age
@age.setter #实现了关于age的setter方法,如果不设置此处,则age为只读属性
def age(self,age):
self._age=age
def play(self):
if self._age<=16:
print('%s玩aa'%self._name)
else:
print('%s玩bb'%self._name)
def main():
person=Person('小明',12)
person.play()
person.age=22
person.play()
if __name__=='__main__':
main()
注意:
- 属性名和方法名不能一样,否则死循环
- 定义方法的时候,@property必须在@xxx.setter之前,且修饰的方法名相同
__slots__
功能:限定当前类只能设置某些属性,但对子类不起作用
实例方法
常规类中定义的方法,需要先实例化后才可以调用,通常第一个参数指定为self,指该类的一个实例化对象
chass Pizza(object):
def __init__(self,size):
self._size=size
def get_size(self):
return self.size
静态方法
- 可以理解是定义在类中的函数,与对象本身的状态无关,无需实例化即可调用,
- 可以在子类中被覆盖
- 使用@staticmethod装饰
class Pizza(object):
@staticmethod
def mix_ingredients(x, y):
return x + y
def cook(self):
return self.mix_ingredients(self.cheese, self.vegetables)
类方法
- 绑定在类对象上的方法
- 可以调用静态方法,而不用硬编码类名
- @classmethod
class Pizza(object):
def __init__(self, radius, height):
self.radius = radius
self.height = height
@staticmethod
def compute_area(radius):
return math.pi * (radius ** 2)
@classmethod
def compute_volume(cls, height, radius):
return height * cls.compute_area(radius)
def get_volume(self):
return self.compute_volume(self.height, self.radius)
抽象方法
- 定义类的类,只能被继承,不能实例化
- 子类必须要有该方法,否则报错
- 子类有此方法就可以,但并不能限定子类方法是类方法还是静态方法,即便在抽象类中使用了@classmethod
import abc
class BasePizza(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def get_radius(self):
"""Method that should do something."""
网友评论