内容简介:在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!")
同样的,静态方法同时支持被类名和类实例调用。
参考
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 装饰器与元数据反射(1)方法装饰器
- [译] PEP 318:函数和方法的装饰器
- Python实现对一个函数应用多个装饰器的方法示例
- 草根学Python(十六) 装饰器(逐步演化成装饰器)
- 一文读懂 JS 装饰器,这是一个会打扮的装饰器
- 装饰器与元数据反射(2)属与类性装饰器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。