python——面向对象——知识汇总二

小白龙白龙马 / 2024-02-26 / 原文

Python property()函数:定义属性

 

我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。

 

正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。


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

 

例如:

 

 

 

这种操作类属性的方式比较麻烦,更习惯使用“类对象.属性”这种方式。

Python 中提供了 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)

 

 

 

 

 

 

 

 

 

 不要构造函数也可以,直接set和get方法处理:

 

 

 

 

 

 

 

 

 

 

 

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

  1. name = property(getname, setname)

 

这意味着,name 是一个可读写的属性,但不能删除,因为 property() 函数中并没有为 name 配置用于函数该属性的方法。

 

也就是说,即便 CLanguage 类中设计有 delname() 函数,这种情况下也不能用来删除 name 属性。 

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

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

 

 

 

 

 

 

 

 ===========================================================================

 

 

 

 

 

 

 

 

Python @property装饰器详解

 

 

 首先讲解装饰器:一个函数可以作为另外一个函数的参数。装饰器接受一个函数,添加一些功能并返回它。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

123

 

123