python class @property_Python中@property和@classmethod和@staticmethod

前戏

首先,先要弄清楚一个类里面的,各个组成部分都应该怎么称呼。

- 注:可能叫法会不太一样。

20180115211216875869.png

关于@property

顾名思义:它的意思为‘属性’。

作用:

1:使用它你将会把类方法,变为类属性。并且是只读属性。

2:它会重新实现getter和setter方法。

看代码:

classPerson:def __init__(self,first_name,last_name):

self.first_name=first_name

self.last_name=last_name

@propertydeffull_name(self):return (‘%s??%s‘%(self.first_name,self.last_name))#用法#实例化类对象

person = Person(‘狗‘, ‘ride‘)#调用类下面的字段

print(person.first_name)print(person.last_name)#调用类下面加过property装饰器的方法。

print(person.full_name) #不需要加括号哦!!!因为我有property

#输出结果:#狗#ride#狗??ride

#字段赋个值,看是否可以。

person.first_name = ‘ri‘person.last_name= ‘狗地‘

print(person.full_name)#输出结果:ri??狗地

#给属性赋值

person.full_name = ‘gougou‘

#Traceback (most recent call last):#File "/property.py", line 37, in #person.full_name = ‘ff‘#AttributeError: can‘t set attribute

# 在此验证了它的只读属性哦

因为我们将方法通过加@property变成了属性。(因此这里我们可以通过调用静态属性的方法,来调用属性)

But,属性是只读的!!!不可以将该属性设为其他值。

第二个功能

代码示例:

from decimal importDecimal#################################################

classFees(object):

#----------------------------------------------------------------------

def __init__(self):"""Constructor"""self._fee=None#----------------------------------------------------------------------

defget_fee(self):"""Return the current fee"""

returnself._fee#----------------------------------------------------------------------

defset_fee(self, value):"""Set the fee"""

ifisinstance(value, str):

self._fee=Decimal(value)elifisinstance(value, Decimal):

self._fee=value

fee=property(get_fee,set_fee)

>>> f = Fees()

>>> f.set_fee("1")

>>> f.fee

Decimal(‘1‘)

>>> f.fee = "2"

>>> f.get_fee()

Decimal(‘2‘)

当我们以这种方式使用属性函数时,它允许fee属性设置并获取值本身而不破坏原有代码。让我们使用属性装饰器来重写这段代码,看看我们是否能得到一个允许设置的属性值。

335b83df261c422459d4afc29ba290e5.png

d1b641f023dd079c9e4a800b96607d9d.gif

1 from decimal importDecimal2

3 #################################################

4

5 classFees(object):6 """"""

7

8 #----------------------------------------------------------------------

9 def __init__(self):10 """Constructor"""

11 self._fee =None12

13 #----------------------------------------------------------------------

14 @property15 deffee(self):16 """

17 The fee property - the getter18 """

19 returnself._fee20

21 #----------------------------------------------------------------------

22 @fee.setter23 deffee(self, value):24 """

25 The setter of the fee property26 """

27 ifisinstance(value, str):28 self._fee =Decimal(value)29 elifisinstance(value, Decimal):30 self._fee =value31

32 #----------------------------------------------------------------------

33 if __name__ == "__main__":34 f =Fees()35

36 #上面的代码演示了如何为fee属性创建一个setter方法。你可以用一个名为@fee.setter的# 装饰器装饰第二个方法名也为fee的方法来实现这个。当你如下所做时,setter被调用:

37

38 >>> f =Fees()39 >>> f.fee = "1"

@fee.setter

如果你想对属性使用del命令,你可以使用@fee.deleter创建另一个装饰器来装饰相同名字的函数从而实现删除的同样效果。

关于@classmethod和@staticmethod

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

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

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看,

@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

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

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

20180115211217927559.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值