面向对象-类中的三个装饰器

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) #这样写起到不容易被别人修改的作用

 

 

 

...

以上是关于面向对象-类中的三个装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

类中的装饰器在Pycharm中抛出警告

python----02(面向对象进阶)

面向对象——绑定方法和非绑定方法

@classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数。下面的例子展示了它们的用法和行为:

32.Python面向对象描述符运算符底层装饰器:闭包-闭包参数-内置装饰器-类装饰器