Python类方法装饰器

栏目: Python · 发布时间: 7年前

内容简介:在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

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 CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具