Python类方法装饰器

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

内容简介:在Python中,装饰器是随处可见的,并且装饰器也是很有用的一种语法糖。本篇文章主要介绍Python类中常见的几个内建装饰器。在面向对象中,为类的属性创建

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

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

@property装饰器

在面向对象中,为类的属性创建 getterssetters 通常被认为是最佳实践。许多语言允许通过不同的方法实现 getterssetters ,或许是通过使用函数,或许是通过语言特有的 getset 构造函数。

在Python中,通过使用 @property 装饰器来实现 getterssetters

property()函数

除了 @property 装饰器, property() 函数也可以在Python中是 getterssetters

下面定义了一个包含 gettersetter 方法的类。

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 属性的时候,能隐式的调用 settergetter 方法,就会方便很多。在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) 返回了一个属性对象,并赋值给了 namename 属性隐藏了对象的私有属性 __namename 属性可以被直接访问,但是隐式调用了 setname()getname() 方法。

除了 gettersetter ,还可以为属性设置个 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 装饰器提供了一种简单的方法来定义 gettersetter

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

下面的代码使用了 @property 装饰器为类定义了 gettersetter

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!")

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

参考


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

独角兽之路

独角兽之路

三节课产品社区 / 电子工业出版社 / 2016-7 / 79.00元

对2~3年以上经验的互联网人来说,最好的学习可能不是听课,而是分析各类真实的产品和运营案例。而《独角兽之路:20款快速爆发且极具潜力的互联网产品深度剖析(全彩)》正好提供了对滴滴出行、百度外卖、懂球帝、快手App等20款极具代表性的准独角兽产品的发展路径的深度分析。 通过阅读《独角兽之路:20款快速爆发且极具潜力的互联网产品深度剖析(全彩)》,你可以发现互联网产品发展的背后,或许存在着某些共......一起来看看 《独角兽之路》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码