装饰器
"""
装饰器,既然称为装饰器,肯定会起到装饰的作用,即可以快速、简便地修改某种事物(这里指函数)的特性。
@classmethod装饰的函数为类方法,类方法可以使类名直接调用,也可以用实例名调用。。
@staticmethod装饰的函数为静态方法(类似普通函数,不需要传递实例属性、方法),静态方法可以通过
类名或实例名调用。
实例方法必须实例化才能调用。使用类方法和静态方法可以把属于类的函数都定义在类里面,使得函数的命名
空间简洁。
@property把方法装饰为属性,采用调用属性的形式调用,即不用加括号。
"""
class Animal:
def name(self):
print("Bob")
@classmethod
def kind(cls):
print("cat")
@staticmethod
def color():
print("yellow")
@property
def price(self):
print("expensive")
Animal().name() # 实例方法必须实例化才能调用,需要传递参数self
Animal.kind()
Animal().kind()
Animal.color()
Animal().color()
Animal().price
抽象基类
"""
抽象基类,不能直接被实例化,只能被其他类继承。继承抽象类后其子类必须实现全部抽象方法,否则子类实例化时会触发异常。
抽象基类提供一个框架,通过定义抽象类来限定类中必须含有哪些接口。抽象类只负责管理接口的有无,
接口的具体实现由子类根据自身应用场景灵活实现。
定义抽象方法的两种方式:
通过@abstractmethod装饰函数为抽象方法,子类没有实现抽象方法时,实例化会抛出异常TypeError。
在实例方法中用raise NotImplementedError来定义抽象方法,子类没有实现抽象方法时,实例化不会抛出异常,
调用时才抛出异常NotImplementedError。
"""
from abc import ABC, abstractmethod
class Animal(ABC): # 定义抽象基类
@abstractmethod
def speak(self): # 抽象方法,必须在子类中实现该方法
pass
def eat(self): # 抽象方法
raise NotImplementedError('子类必须实现该抽象方法。')
class Dog(Animal):
def speak(self):
print('汪汪!')
def eat(self):
print('爱吃肉骨头!')
dog = Dog()
dog.speak()
dog.eat()