面向对象-类中的三个装饰器
Posted crazysheldon1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象-类中的三个装饰器相关的知识,希望对你有一定的参考价值。
为了代码更加完善,引入几个装饰器..
装饰类中的方法
-
@classmethod --->装饰类方法,不用self属性,只用类的cls属性
-
@staticmethod --->装饰静态方法,既不用self属性,又不用类cls的属性
-
@property --->把一个方法伪装属性
下面具体说说他们的用法:
[email protected]装饰类方法,那什么是类方法呢?
在类中一个方法不用对象属性,但使用静态属性,那这个方法就是类方法,被classmethod装饰器装饰的方法,都有一个默认的参数cls,这个参数就是当前类!
class A: __count = 0 def __init__(self,name): self.name = name self.__add_count() #只要执行init方法实例化对象就会产生调用 __add_count(),从而对静态属性__count操作 @classmethod def __add_count(cls): #私有方法 cls.__count += 1 #让这个方法只能在内部被使用 @classmethod #被classmethod装饰器装饰的方法,都有一个默认的参数,这个参数就是当前类 def show_count(cls): return cls.__count print(A.show_count()) # 0 类调用show_count方法查看类的静态属性 Sheldon = A(‘Sheldon‘) # 实例化一个对象 print(Sheldon.show_count()) # 1 对象调用show_count方法查看类的静态属性
可以看出调用类方法,可以用对象调用,也可以使用类调用
但是这个方法默认参数永远是当前类的命名空间,而不是对象的
[email protected]装饰器装饰静态方法,什么静态方法呢?
如果一个类中的方法不使用对象属性也不使用静态属性 -- 静态方法,@staticmethod装饰的这个方法实际上这个方法就是一个普通函数.
总结:
普通方法 类方法 静态方法
默认参数 self cls 无
操作的变量 操作对象属性 操作静态属性 既不操作对象属性,也不操作类的属性
所属命名空间 类 类 类
调用方式 对象 类/对象 类/对象
装饰器 无 @classmethod @staticmethod
[email protected] 把一个方法伪装成属性
@name.setter 注意,setter 装饰的函数名叫什么,那么在这个函数中绝对不可以对这个函数名同名属性的修改
@name.deleter 调用方方法进行删除属性
示例1 from math import pi class Circle: def __init__(self,r): self.r = r @property # 把一个方法伪装成属性 def area(self): # 被property装饰器装饰的方法不能传递除self以外的参数 return pi*self.r**2 @property def perimeter(self): return self.r*pi*2 c1 = Circle(5) print(c1.area) c1.r = 10 print(c1.area) 调用的时候不用加()
示例2
class Person: def __init__(self,name): self.__name = name # 不让外部随便修改 @property def name(self): return self.__name Sheldon = Person(‘Sheldon‘) print(Sheldon.name) #这样写起到不容易被别人修改的作用
...
以上是关于面向对象-类中的三个装饰器的主要内容,如果未能解决你的问题,请参考以下文章
@classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数。下面的例子展示了它们的用法和行为: