Python类与对象(下)(13/30)

前言

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())

归纳总结

思维脑图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值