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 是经典类中的一种装饰器,新式类中具有三种:
1.@property获取属性
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就可以,不定义代表禁止其他操作。

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值