Python学习06.10:Python property()函数:定义变量

旧城冷巷雨未停 提交于 2020-02-26 18:47:22

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

因此,在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 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("C语言中文网")

# 获取name属性值
print(clang.getname())

# 设置name属性值
clang.setname("Python教程")
print(clang.getname())

# 删除name属性值
clang.delname()
print(clang.getname())


#运行结果如下:


C语言中文网
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("C语言中文网")

# 调用 getname() 方法
print(clang.name)

# 调用 setname() 方法
clang.name="Python教程"
print(clang.name)

# 调用 delname() 方法
del clang.name
print(clang.name)


# 运行结果为


Help on property:

    指明出处

C语言中文网
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属性可读、可写、也可删除,就是没有说明文档

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!