Python进阶记录之基础篇十九

中科白癜风公益活动 http://m.39.net/pf/a_6213643.html

回顾

在Python进阶记录之基础篇(十八)中,我们介绍了Python面向对象中多继承和多态的相关知识点。至此,我们已经对面向对象的三大特征:封装、继承和多态有了初步的认识,今天我们讲一下Python面向对象中属性的高级用法。

使用

property装饰器

在之前的内容中,我们知道,如果我们使用公有变量直接把属性暴露出去,生成的对象就可以通过“对象.属性”的形式直接进行修改。

修改公有变量

这种写法虽然写起来简单,但我们没办法对属性进行限制,导致可以随意修改。因此,我们提出使用私有变量,同时提供setter和getter方法来修改和获取属性。

setter/getter方法

在setter方法中,我们可以对属性进行条件控制,这样,当外部试图以一个非常规值修改属性时,就可以被限制修改了。但是,调用setter方法没有直接使用属性来得简单。那么,有没有既能对属性进行限制,又可以用“对象.属性”的形式来访问属性呢?答案当然是肯定的。

我们之前介绍过装饰器的相关内容,装饰器是可以给函数动态加上功能的。对于方法,装饰器同样如此。Python内置的

property装饰器就是负责把一个方法变成属性调用的。

property装饰器

使用

property装饰器可以把一个getter方法变成属性取值,当我们将age的getter方法使用

property装饰器装饰时,

property本身又会创建另一个装饰器

age.setter,负责把age的setter方法变成属性赋值。需要注意的是,此时不再使用set/get的形式命名setter和getter方法,而是直接使用属性名作为方法。这样,我们就可以通过“对象.属性”的形式来访问属性了。

使用__slots__魔法

我们之前说过,Python是动态语言,在创建好对象后,可以给该对象绑定任何属性和方法。

动态绑定属性

可以看到,在创建对象的时候只有name和age两个属性,但我们再创建好对象后,又成功绑定了一个新属性gender。

但是,有时候我们并不希望使用这种动态绑定属性的方式。例如在项目开发中,我们需要对某个类进行属性限制,不允许外部动态增加属性。这时,我们就可以借助__slots__魔法了。

__slots__魔法

使用__slots__魔法,通过元组tuple定义要绑定的属性。此时,我们如果再次试图在创建对象后动态得增加gender属性,会发现Python报错:hasnoattribute。Student类就已经只允许name和__age两个属性了。

需要注意的是,子类是不会继承父类的__slots__魔法的。

子类不继承__slots__魔法

可以看到,即使父类中使用__slots__魔法限定了只允许name和__age两个属性,但是子类中依然可以动态添加属性。要想子类也限定属性,只能在子类中也定义__slots__魔法。

总结

以上内容介绍了Python面向对象中属性的高级用法,需要重点掌握

property装饰器和__slot__魔法的意义和使用方法。感谢大家的支持与


转载请注明:http://www.aierlanlan.com/rzfs/2506.html