【python心得】面向对象中你肯定会用到的的三个内置装饰器 @property @classmothod @staticmothod

当我们在python中用面向对象编程时,为了使代码更加简洁,或者实现一些特殊功能,往往会用到python内置的装饰器,其中,从常用的三个是
@property
@classmothod
@staticmothod
先来介绍@property,我们在类中调用对象的方法时,会使用对象.方法()的方式,当代码封装之后,如果我们不希望通过这样的方式调用,或者让调用的方式看起来像调用属性一样,例如采用对象.属性的方式时,就可以采用@property进行装饰。
代码格式如下:

@property
def 方法名(self)
    代码块

举例说明:

class A:
    def __init__(self):
        pass
    def func(self):
        print('@property测试')
a=A()
a.func()

输出结果

@property测试

这时我们需要通过a.func()的方式进行调用,当我们在func之前使用@property进行装饰时,则只要使用a.func调用即可,看起来似乎是在调用属性。
代码如下:

class A:
    def __init__(self):
        pass
    @property
    def func(self):
        print('@property测试')
a=A()
a.func

输出结果是相同的。

当我们需要在类中调用某个方法时,而这个方法我们不希望通过实例化某个对象去调用,这时我们可以使用@staticmethod方法,
代码块如下:

@staticmethod
def 方法名(self)
    代码块

举例说明

class A:
    def __init__(self):
        pass
    @staticmethod
    def func():
        return '@staticmethod测试'
print(A.func())

还是上面的代码,在增加@staticmethod装饰器之后,我们可以通过类名.方法名的方式直接调用类中的函数,而无需实例化某个对象。

当我们需要修改类中的静态属性,但不希望实例化某个对象,这时可以通过@classmethod来进行,代码块如下:

@classmethod
def 方法名(cls,new)
    代码块

具体如下:

class A:
    __name=1
    @classmethod
    def func(cls,new):
        cls.__name=new
# print(A.name)
print(A._A__name)
A.func(2)
print(A._A__name)

当我们定义私有变量__name为静态属性后,类之外我们是无法修改的,但我们使用classmethod装饰器之后,就可以通过类方法进行修改,需要注意的是,func(cls,新变量)中cls是不可省略的,cls和self可以改变,但大家约定使用cls,新的变量只能有一个比如上面的例子,输出结果为
1
2

总结如下:
1.@property用于修饰类中的方法,装饰后,可以像调用属性一样调用
2.@staticmethod 用于装饰静态方法,使用后可以直接调用类中的方法,而无需实例化对象
3.@classmethod 用于仅仅涉及静态属性的情况下,可以把一个方法变成类中的方法,同时对私有静态属性进行修改

发布了13 篇原创文章 · 获赞 1 · 访问量 191

猜你喜欢

转载自blog.csdn.net/aa12551827/article/details/104905555
今日推荐