前言
Life is short,you need Python !(持续更新)书接上文,本篇文章介绍下半部分内容Python类与对象。
大纲
- 描述符与装饰器
- 封装继承与多态
描述符与装饰器
描述符
通过使用描述符,可以让程序员在引用一个对象属性时自定义要完成的工作。
描述符(Descriptor)就是以特殊方法get(), set(), delete()的形式实现了三个核心的属性访问操作(set,get,delete)的类。这些方法接受类实例作为输入来工作。之后,底层的实例字典会根据需要适当的进行调整。
_set_(self, obj, type=None):在设置属性时将调用这一方法;_ get_(self, obj, value):在读取属性时将调用这一方法__delete__(self, obj):对属性调用 del 时将调用这一方法。
从这个例子可以看到,如果一个类的某个属性有数据描述符,那么每次查找这个属性时,都会调用描述符的 _get_() 方法,并返回它的值;同样,每次在对该属性赋值时,也会调用 __set __() 方法。
#描述符类
class revealAccess:
def __init__(self, initval = None, name = 'var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print("Retrieving",self.name)
return self.val
def __set__(self, obj, val):
print("updating",self.name)
self.val = val
class myClass:
x = revealAccess(10,'var "x"')
y = 5
m = myClass()
print(m.x)
print('--------------')
m.x = 20
print(m.x)
print('--------------')
print(m.y)
'''
从这个例子可以看到,如果一个类的某个属性有数据描述符,那么每次查找这个属性时,都 会调用描述符的 __get__() 方法,并返回它的值;同样,每次在对该属性赋值时,也会调用 __set__() 方法。
'''
装饰器
函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
def sayName(func):
return func
@sayNamedef
sayHi():
print('Hello, World')
sayHi()
封装继承与多态
封装
封装有两个方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来。
只要将 Python 类的成员命名为以双下画线开头的,Python 就会把它们隐藏起来。
继承
class 类名(父类1, 父类2, …):
#类定义部分 按照顺序优先级,同名字的函数,顺序优先
class Fruit:
def info(self):
print("我是一个水果!重%g克" %self.weight)
class Food:
def taste(self):
print("不同食物的口感不同")
# 定义Apple类,继承了Fruit和Food类
class Apple(Fruit, Food):
pass
# 创建Apple对象
a = Apple()
a.weight = 5.6
# 调用Apple对象的info()方法
a.info()
# 调用Apple对象的taste()方法
a.taste()
多态
当同一个变量在调用同一个方法时,完全可能呈现出多种行为(具体呈现出哪种行为由该变量所引用的对象来决定)
class Canvas:
def draw_pic(self, shape):
print('--开始绘图--')
shape.draw(self)
class Rectangle:
def draw(self, canvas):
print('在%s上绘制矩形' % canvas)
class Triangle:
def draw(self, canvas):
print('在%s上绘制三角形' % canvas)
class Circle:
def draw(self, canvas):
print('在%s上绘制圆形' % canvas)
c = Canvas()
# 传入Rectangle参数,绘制矩形
c.draw_pic(Rectangle())
# 传入Triangle参数,绘制三角形
c.draw_pic(Triangle())
# 传入Circle参数,绘制圆形
c.draw_pic(Circle())