Python中@staticmethod、@classmethod、@property静态修饰符的用法

正常的写个类,里面写方法,比如有如下的格式写法:

class TestStatic:
    def NomalFun(self,name):
        return "Hi,"+name
ts=TestStatic()
print(ts.NomalFun('Tony'))#Hi,Tony

这属于一种常见写法,类里面写方法,然后我们在调用方法时,需要将类实例化成对象,再来调用。

如果类没有实例化,直接调用的话,我们来看下会发生什么情况:

print(TestStatic.NomalFun('Tony'))
NomalFun() missing 1 required positional argument: 'name'

就会出现上面这样的错误!

@staticmethod

那如果想要类.方法,直接调用,如何实现呢?于是我们将@staticmethod这个装饰符加到方法上面,看看会是个什么情况?

@staticmethod
def StaticFunc():
    return "这是一个静态方法"
print(TestStatic.StaticFunc())#这是一个静态方法

没有错误,可以不用实例化直接调用,当然了,在这个例子中不加@staticmethod也可以,因为没有self参数^_^,这些都不是需要重点关注的问题。

那为什么要出现这样一个装饰符,有什么作用呢?

如果这个方法既不需要使用实例对象 (如实例对象,实例属性) ,也不需要使用类对象 ( 如类属性、类方法、创建实例等) 时,就将这个方法定义成一个静态方法,这样的好处是优化代码结构,提高代码的可读性,也提高了性能,因为实例化对象需要开销。或者通俗的来讲就是这些静态方法跟这个类不是特别相关,但是写在这个类里面,方便一点,这么去理解可能更好点。

@classmethod

上面是静态方法,还有一种就是类方法,也是在方法的上面进行装饰。

我们来看下加个@classmethod装饰之后的情况是怎么样的。

class TestStatic:
    @staticmethod
    def MyStaticFunc(hobby):
        return "爱好是:"+hobby

    @classmethod
    def ClassFunc(cls):
        return TestStatic.MyStaticFunc('阅读')

ts = TestStatic()
print(ts.ClassFunc())#爱好是:阅读

这里的类方法ClassFunc里面可以直接调用类里的静态方法MyStaticFunc,这里有一个cls的参数,其中self代表着自身对象,cls代表着自身类。

所以在类方法里面也可以将return TestStatic.MyStaticFunc('阅读')修改成return cls.MyStaticFunc('阅读')两者的效果是一样的,cls代表自身所在的类,所以直接用类或者cls都可以调用里面的静态方法。

@property

这个@property修饰符,看得出是属性的意思,也就是说我们可以将一个方法转成属性的用法。

class Test:
    def __init__(self,name):
        self.name=name

    def f(self):
        print(self.name)

    @property
    def getname(self):
        print(self.name)

t = Test('Tony')
t.f()#Tony
t.getname#Tony

注意看调用的时候,一个是正常的调用方法t.f(),而getname()方法由于加了@property修饰符,这个时候不能按照方法来调用,需当作属性来对待,直接t.getname即可。

最后附加一个setterdeleter

class Test:
    def __init__(self,name):
        self.name=name
    def f(self):
        print(self.name)
    @property
    def getname(self):
        print(self.name)
    @getname.setter
    def getname(self,value):
        self.name=value
    @getname.deleter
    def getname(self):
        raise AttributeError("不能删除")

获取装饰成属性的值跟获取成员变量一样结果

t = Test('Tony')
t.name        #Tony
t.getname    #Tony
#赋值
t.getname="寅恪光潜"
t.name#寅恪光潜
#删除
del t.name

删除之后再访问就报错:

Traceback (most recent call last):
File "", line 1, in
AttributeError: 'Test' object has no attribute 'name'

再赋值,t.getname="寅恪光潜"

>>> print(t.name)

寅恪光潜

你可能感兴趣的:(Python,staticmethod,classmethod,property)