天天看点

python中的@classmethod,@staticmethod,@property三种装饰器类方法和静态方法的使用:

一、@classmethod

类方法,不需要实例化,也不需要self参数,需要一个cls参数,可以用类名调用,也可以用对象来调用。

原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,那么这个方法就可以定义为类方法

二、@staticmethod

静态方法,不需要实例化,不需要self和cls等参数,就跟使用普通的函数一样,只是封装在类中

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

类方法和静态方法的使用:

class Foo(object):
    @classmethod
    def cls_fun(cls):
        return "hello world"
    @staticmethod
    def static_fun():
        return "hello python"

foo = Foo()
print(Foo.cls_fun())
# print(foo.cls_fun())
print(Foo.static_fun())
           

注意点:

使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名

@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

三、@property

属性方法,主要作用是将一个操作方法封装成一个属性,用户用起来就和操作普通属性完全一致,非常简单.定义时,在实例方法的基础上添加@property装饰器,并且只有一个self参数,调用时,不需要括号

@property 是经典类中的一种装饰器,新式类中具有三种:

[email protected]获取属性

2.@方法名.setter 修改属性

3.@方法名.deleter 删除属性

@property的使用:

class Goods(object):

    def __init__(self):
        # 原价
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    @property
    def price(self):
        # 实际价格 = 原价*折扣
        new_price = self.original_price*self.discount
        return new_price

    @price.setter
    def price(self,value):
        self.original_price = value

    @price.deleter
    def price(self):
        del self.original_price


obj = Goods()
# print(obj.price)
obj.price = 200
print(obj.price)
del obj.price  # 删除了类中的price属性若再次调用就会报错
           

总结:类方法,是直接对类操作时候定义的,实例化方法是操作实例化对象时候定义的,静态方法与类无关,就是独立的逻辑单元。@property是将方法转为属性,直接可使用其返回值,提供了可读可写可删除的操作,如果像只读效果,就只需要定义@property就可以,不定义代表禁止其他操作。