Python类方法装饰器

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

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

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

参考


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

查看所有标签

猜你喜欢:

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

Unity 3D游戏开发(第2版)

Unity 3D游戏开发(第2版)

宣雨松 / 人民邮电出版社 / 2018-9 / 89.00元

Unity 是一款市场占有率非常高的商业游戏引擎,横跨25 个主流游戏平台。本书基于Unity 2018,结合2D 游戏开发和3D 游戏开发的案例,详细介绍了它的方方面面,内容涉及编辑器、游戏脚本、UGUI 游戏界面、动画系统、持久化数据、静态对象、多媒体、资源加载与优化、自动化与打包等。 本书适合初学者或者有一定基础的开发者阅读。一起来看看 《Unity 3D游戏开发(第2版)》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具