day22_类常用装饰器
目录
1、@property
2、@abc.abstractmethod
3、@classmethod
4、@staticmethod
# 1 @property
# 使得对象调用方法时,不用加括号
class Foo:
@property
def f1(self):
print('你又偷看我')
foo = Foo()
foo.f1 # 不用加括号即可调用方法,就像调用一般的数据属性一样
'''
你又偷看我'''
# 2 @abc.abstractmethod
# 抽象类的实现,需要导入模块abc
import abc # 导入abc模块
class Foo(metaclass=abc.ABCMeta): #参数固定写法
@abc.abstractmethod
def func(self):
print('小崽子们,照着我的名字来!')
def func2(self):
print('不需要复制我的名字!')
name = '我不是方法,不能成为抽象类的标准属性'
# 不按照抽象类标准方法定义
class Boo(Foo):
def m1(self):
print('你能看到我的时候,你就成功了')
# 按照抽象类标准方法定义
class Boo2(Foo):
def func(self):
super().func() # 基于继承背景下,对象属性的的重用
print('好的,按照你的名字来,大佬!')
def m1(self):
print('你能看到我的时候,你就成功了')
# 实例化之前,定义阶段,不会报错
# 实例化类Boo
# 实例化的时候就报错:TypeError: Can't instantiate abstract class Boo with abstract methods func
boo = Boo()
boo.m1()
# 实例化Boo2
boo2 = Boo2()
boo2.m1()
boo2.func()
'''
你能看到我的时候,你就成功了
小崽子们,照着我的名字来!
好的,按照你的名字来,大佬!'''
# 3 @classmethod
# 使得方法成为类的绑定方法,即该方法的第一个参数只能绑定为一个类,该方法中只能访问这个类的共有属性,不能访问对象的独立属性
class Foo:
x = 10
@classmethod
def func(cls):
print(cls)
print(cls.x)
foo = Foo()
foo.func() # 使用对象调用类绑定方法时,会将对象所属的类传入func
Foo.func()
'''
<class '__main__.Foo'>
10
<class '__main__.Foo'>
10'''
# 4 @staticmethod
# 使得方法成为非绑定方法,即成为一个普通属性,类和对象都能直接调用
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
@staticmethod
def tell_something():
print('''你们都不能绑定我,哈哈''')
foo = Foo('alex',18)
foo.tell_something()
Foo.tell_something()
'''
你们都不能绑定我,哈哈
你们都不能绑定我,哈哈'''