Python property

Python property教程

Python 中的 属性 我们可以使用 “类对象.属性” 的方式来访问,这种方式虽然方便,但它破坏了 的封装原则。

正常情况下的类,它包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。因此,在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 getter(或 setter)方法,这样就可以通过 “类对象.方法(参数)” 的方式操作属性。

如果,我们为每一个属性都提供一个 getter 和 setter 方法,那么程序会非常麻烦,因此,在 Python 中,为开发者提供了 property() 函数,可以实现在不破坏类封装原则的前提下,让开发者依旧使用 “类对象.属性” 的方式操作类中的属性。

Python property详解

语法

class property([fget[, fset[, fdel[, doc]]]])

参数

参数 描述
fget 获取属性值的函数。
fset 设置属性值的函数。
fdel 删除属性值函数。
doc 属性描述信息。

返回值

返回新式类属性。

案例

使用 get set方法

使用 get set 方法,操作类属性

print("嗨客网(www.haicoder.net)") class Person(object): def __init__(self, name, age): self.name = name self.age = age def setname(self, name): self.name = name def setage(self, age): self.age = age def getname(self): return self.name def getage(self): return self.age def info(self): print("Name =", self.name, "Age =", self.age) # 使用property定义属性 name = property(getname, setname, '用于描述矩形大小的属性') # 使用property定义属性 age = property(getage, setage, '用于描述矩形大小的属性') person = Person("haicoder", 18) person.info() person.setname("HaiCoder") person.setage(20) name = person.getname() age = person.getage() print("New name =", name, "age =", age)

程序运行后,控制台输出如下:

59_python类property.png

我们定义了一个 Person 类,类中定义了 构造函数 和一个 name 属性一个 age 属性。

接着,我们分别为 name 属性和 age 属性提供了 get 和 set 方法分别用来获取属性的值和设置属性的值,我们看到,要是类中的属性非常多,我们使用 get set函数操作属性,非常麻烦。

使用 property 方法

使用 property 方法,操作类属性

print("嗨客网(www.haicoder.net)") class Person(object): def __init__(self, name, age): self.name = name self.age = age def setinfo(self, info): self.name, self.age = info def getinfo(self): return self.name, self.age def delinfo(self): self.name, self.age = "", 0 # 使用property定义属性 info = property(getinfo, setinfo, doc='用于name和age属性') person = Person("haicoder", 18) print("Name =", person.name, "Age =", person.age) person.name = "HaiCoder" person.age = 20 print("Name =", person.name, "Age =", person.age) person.info = ("haicoder", 109) print("Name =", person.name, "Age =", person.age)

程序运行后,控制台输出如下:

60_python类property.png

我们定义了一个 Person 类,类中定义了构造函数,一个 setinfo 方法、 getinfo 方法、和一个 delinfo 方法,以及一个 name 属性和一个 age 属性。

同时,我们使用 property 定义了一个 info 属性,info 属性用于对类的 name 属性和 age 属性进行操作,用于定义 info 属性的 property 方法传入了用于获取 info 属性值的方法和用于设置 info 属性值的方法。

最后,我们可以通过构造函数设置 name 和 age 的属性值,也可以通过 “实例.属性” 的方式操作 name 和 age 属性,还可以通过 info 属性,直接设置 name 和 age 的值。

直接通过 info 属性设置 name 和 age 的值的方式比对 name 和 age 字段单个赋值要方便很多。

Python property教程总结

Python 中的属性我们可以使用 “类对象.属性” 的方式来访问,这种方式虽然方便,但它破坏了类的封装原则。

正常情况下的类,它包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。因此,在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 getter(或 setter)方法,这样就可以通过 “类对象.方法(参数)” 的方式操作属性。