python @装饰器的使用 staticmethod classmethod property

1、内置staticmethod & classmethod装饰器

Python中内置以上两个装饰器,内置的优点是:1、不需要实例化,可以直接调用;2、提升代码的可读性;因此python中有三种定义类的方法:常规方式;@classmethod修饰方式;@staticmethod修饰方式.

class A(object):
    def foo(self, x):
        print("executing foo(%s,%s)" % (self, x))
        print('self:', self)
        
    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s,%s)" % (cls, x))
        print('cls:', cls)
        
    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)    
定义方式
  1. 普通方法:
    定义:
    第一个参数为self,代表 实例本身
    调用:
    要有实例化的过程,通过 实例对象.方法名 调用

  2. 类方法
    定义:
    使用 @classmethod 装饰器,第一个参数为类本身,所以通常使用cls命名做区分(非强制)
    在类内可以直接使用类方法或类变量,无法直接使用实例变量或方法
    调用:
    无需实例化,直接通过 类.方法名 调用,也可以通过实例.方法名调用
    注意:
    类方法内不可以直接调用实例方法,也不可以调用实例变量
    类和实例都可以直接调用类方法。
    使用环境:在不修改原有代码的基础上,进行二次功能拓展。

  3. 静态方法
    定义:
    使用 @staticmethod 装饰器,没有和类本身有关的参数
    无法直接使用任何类变量、类方法或者实例方法、实例变量
    调用:
    无需实例化,直接通过 类.方法名 调用,也可以通过 实例.方法名 调用

总结

在这里插入图片描述

2、内置@property装饰器

Python内置的@property装饰器可以把类的方法伪装成属性调用的方式。也就是本来是Foo.func()的调用方法,变成Foo.func的方式。将一个方法伪装成为属性后,就不再使用圆括号的调用方式,而是类似变量的赋值、获取和删除方法。

class People:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        if isinstance(age, int):
            self.__age = age
        else:
            raise ValueError

    @age.deleter
    def age(self):
        print("删除年龄数据!")
        
obj = People("jack", 18)
print(obj.age)
obj.age = 19
print("obj.age:  ", obj.age)
del obj.age

我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
使用场景:
1.修饰方法,使得方法可以像属性一样访问。
2.与所定义的属性配合使用,这样可以防止属性被修改。
​由于python进行属性的定义时,没办法设置私有属性,因此要通过@property的方法来进行设置。这样可以隐藏属性名,让用户进行使用的时候无法随意修改。个人理解是将变量进行封装,使其使用类似于const变量,提高变量阅读与修改的安全性。

原因主要是python中无法实现绝对的private 和 preotected属性。
类中 单下划线和双下划线的属性,在类外部,均可以使用实例化对象访问并且修改。区别在于:双下划线的属性名 ____FileName 被解释器重写为 _ClassName__FileName ,所以访问或者修改它的时候是 实例名._ClassName__FileName ,而单下划线的属性 _FileName,依然可以用 实例名._FileName 访问或修改。
参考:python @property的介绍与使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值