内容简介:在Python中,装饰器是随处可见的,并且装饰器也是很有用的一种语法糖。本篇文章主要介绍Python类中常见的几个内建装饰器。在面向对象中,为类的属性创建
在 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!")
同样的,静态方法同时支持被类名和类实例调用。
参考
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Four
Scott Galloway / Portfolio / 2017-10-3 / USD 28.00
NEW YORK TIMES BESTSELLER USA TODAY BESTSELLER Amazon, Apple, Facebook, and Google are the four most influential companies on the planet. Just about everyone thinks they know how they got there.......一起来看看 《The Four》 这本书的介绍吧!
HEX CMYK 转换工具
HEX CMYK 互转工具
HEX HSV 转换工具
HEX HSV 互换工具