Python property()函数:定义属性

格桑2021-09-15 11:20

    前面章节中,我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。

Pythonproperty()函数:定义属性

    因此,在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个getter(或setter)方法,这样就可以通过“类对象.方法(参数)”的方式操作属性,例如: 

class CLanguage:
    #构造函数
    def __init__(self,name):
        self.name = name 
    #设置 name 属性值的函数 
    def setname(self,name):
        self.name = name
    #访问nema属性值的函数
    def getname(self):
        return self.name
    #删除name属性值的函数
    def delname(self):
        self.name="xxx"
clang = CLanguage("开课吧广场")
#获取name属性值
print(clang.getname())
#设置name属性值
clang.setname("Python教程")
print(clang.getname())
#删除name属性值
clang.delname()
print(clang.getname())

    运行结果为:

    开课吧广场
    Python教程
    xxx

    可能有读者觉得,这种操作类属性的方式比较麻烦,更习惯使用“类对象.属性”这种方式。

    庆幸的是,Python中提供了property()函数,可以实现在不破坏类封装原则的前提下,让开发者依旧使用“类对象.属性”的方式操作类中的属性。

    property()函数的基本使用格式如下:

属性名=property(fget=None, fset=None, fdel=None, doc=None)

    其中,fget参数用于指定获取该属性值的类方法,fset参数用于指定设置该属性值的方法,fdel参数用于指定删除该属性值的方法,最后的doc是一个文档字符串,用于说明此函数的作用。

    注意,在使用property()函数时,以上4个参数可以仅指定第1个、或者前2个、或者前3个,当前也可以全部指定。也就是说,property()函数中参数的指定并不是完全随意的。

    例如,修改上面的程序,为name属性配置property()函数: 

class CLanguage:
    #构造函数
    def __init__(self,n):
        self.__name = n
    #设置 name 属性值的函数
    def setname(self,n):
        self.__name = n
    #访问nema属性值的函数
    def getname(self):
        return self.__name
    #删除name属性值的函数
    def delname(self):
        self.__name="xxx"
    #为name 属性配置 property() 函数
    name = property(getname, setname, delname, '指明出处')
#调取说明文档的 2 种方式
#print(CLanguage.name.__doc__)
help(CLanguage.name)
clang = CLanguage("开课吧广场")
#调用 getname() 方法
print(clang.name)
#调用 setname() 方法
clang.name="Python教程"
print(clang.name)
#调用 delname() 方法
del clang.name
print(clang.name)

    运行结果为:

Help on property:

    指明出处

开课吧广场
Python教程
xxx

    注意,在此程序中,由于getname()方法中需要返回name属性,如果使用self.name的话,其本身又被调用getname(),这将会先入无限死循环。为了避免这种情况的出现,程序中的name属性必须设置为私有属性,即使用__name(前面有2个下划线)。

    有关类属性和类方法的属性设置(分为共有属性、保护属性、私有属性),后续章节会做详细介绍。

    当然,property()函数也可以少传入几个参数。以上面的程序为例,我们可以修改property()函数如下所示

name = property(getname, setname)

    这意味着,name是一个可读写的属性,但不能删除,因为property()函数中并没有为name配置用于函数该属性的方法。也就是说,即便CLanguage类中设计有delname()函数,这种情况下也不能用来删除name属性。

    同理,还可以像如下这样使用property()函数:

name = property(getname)    # name 属性可读,不可写,也不能删除
name = property(getname, setname,delname)    #name属性可读、可写、也可删除,就是没有说明文档

    以上就是小编为大家整理发布的“Pythonproperty()函数:定义属性”一文,更多相关内容尽在开课吧广场Python教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享