python类方法为装饰器_Python类方法装饰器

本文介绍了Python中的装饰器,包括@property、@classmethod和@staticmethod等常用装饰器的使用方法及应用场景,帮助读者理解如何利用这些装饰器提高代码质量和可维护性。

在 Python 中,装饰器是随处可见的,并且装饰器也是很有用的一种语法糖。

本篇文章主要介绍Python类中常见的几个内建装饰器。

@property装饰器

在面向对象中,为类的属性创建 getters

和 setters

通常被认为是最佳实践。许多语言允许通过不同的方法实现 getters

和 setters

,或许是通过使用函数,或许是通过语言特有的 get

和 set

构造函数。

在Python中,通过使用 @property

装饰器来实现 getters

和 setters

property()函数

除了 @property

装饰器, property()

函数也可以在Python中是 getters

和 setters

下面定义了一个包含 getter

和 setter

方法的类。

class Persone:

def __init__(self, name='Jim Green'):

self.__name = name

def getname(self):

return self.__name

def setname(self, name):

self.__name = name

person = Persone()

print(person.getname())

person.setname('David')

print(person.getname())

输出:

Jim Green

David

从输出可以看出, getname()

方法返回了 __name

属性的值, setname()

方法设置了 __name

属性的值。但是,如果在修改和获取 __name

属性的时候,能隐式的调用 setter

和 getter

方法,就会方便很多。在Python中,提供了 propterty()

函数达到这种目的。

Python中 property()

方法提供了一个访问实例属性的接口, property()

方法将 get

, ‘set’, delete

方法作为参数,返回一个 属性

(property)类的对象。

下面为类增加一个 property()

方法:

class Persone:

def __init__(self, name='Jim Green'):

self.__name = name

def getname(self):

print('getname()...called')

return self.__name

def setname(self, name):

print('setname()...called')

self.__name = name

name = property(getname, setname)

在上面的例子中, property(getname, setname)

返回了一个属性对象,并赋值给了 name

。 name

属性隐藏了对象的私有属性 __name

。 name

属性可以被直接访问,但是隐式调用了 setname()

和 getname()

方法。

除了 getter

和 setter

,还可以为属性设置个 del

方法,代码如下:

class Person:

def __init__(self, name='Jim Green'):

self._name = name

def getname(self):

print('getname()...called')

return self._name

def setname(self, name):

print('setname()...called')

self._name = name

def delname(self):

print('delname()...called')

del self._name

name = property(getname, setname, delname)

person = Person('Hi')

print(person.name)

person.name = 'David'

print(person.name)

del person.name

输出:

getname()...called

Hi

setname()...called

getname()...called

David

delname()...called

@property装饰器

相比 property()

函数, @property

装饰器提供了一种简单的方法来定义 getter

和 setter

@property

装饰器是Python内建的装饰器。

下面的代码使用了 @property

装饰器为类定义了 getter

和 setter

class Person:

def __init__(self, name="Jim"):

self.__name = name

@property

def name(self):

print('call name with property()')

return self.__name + 'Hi'

@name.setter

def name(self, name):

print('call setter')

self.__name = name

@name.deleter

def name(self):

print('call deleter')

del self.__name

person = Person('Davi')

print(person.name)

person.name = 'Jim'

print(person.name)

del person.name

输出:

call name with property()

Davi Hi

call setter

call name with property()

Jim Hi

call deleter

使用 property()

或者 @property

为类设置属性的好处有以下几点:

校验: 在设置类内部属性之前,可以对传入的值进行校验,只有当满足条件后,才能设置属性,如果不满足条件,则抛出错误。

懒加载: 资源可以被延迟加载,只有当真正使用的时候才被加载,可以节省时间和资源。

抽象: getter和setter可以对类内部数据的真正表示进行抽象,如上面的例子,调用 name

返回的其实是拼接出来的数据,并不是 __name

属性真正的值。

@classmethod装饰器

@classmethod

装饰器可以被用在任何一个类方法上,它允许我们使用类名直接调用方法,而不用先创建一个对象。

被 @classmethod

装饰器装饰的方法,第一参数不是 self

, 而是 cls

, 代表类本身。

@classmethod

装饰器使用方法如下:

class Person:

total = 0

def __init__(self):

Person.total = Person.total + 1

@classmethod

def showTotal(cls):

print(f'Total: {cls.total}')

person1 = Person()

Person.showTotal()

person2 = Person()

Person.showTotal()

输出:

Total: 1

Total: 2

被 @classmethod

装饰器装饰的方法,除了可以通过类名直接调用,也可以通过对象调用。

@staticmethod装饰器

@staticmethod

同样是Python内建的装饰器,该装饰器在Python类中用来定义静态方法。

静态方法在被类实例或者类自身调用时,不接受任何参数。

@staticmethod

使用方法如下:

class person:

@staticmethod

def greet():

print("Hello!")

同样的,静态方法同时支持被类名和类实例调用。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值