博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象-多态,反射
阅读量:6717 次
发布时间:2019-06-25

本文共 3057 字,大约阅读时间需要 10 分钟。

抽象父类

# 抽象父类:拥有抽象方法(子类共有的方法,但是父类不能有具体的实现体)的父类#       抽象方法:方法名是具体的,但是实现体是抽象的(在子类中重写来具象化)​# 注意点:有抽象方法的父类不能被实例化(假设能被实例化,就可以调用自己的抽象方法,没有任何意义)​# 实现抽象父类的语法import abs# abstract base classclass Sup(metaclass=abc.ABCMeta):    # 抽象父类中的抽象方法,在继承它的子类中必须有自己的实现体    #       -- 抽象父类中的抽象方法实现体就没有意义,实现与不实现都是pass填充    @abc.abstractmethod    def func(self): passclass Sub(Sup):    def func(self):        # 必须重写父类的抽象方法

案例

import abcclass Quan(metaclass=abc.ABCMeta):    def __init__(self, name):        self.name = name    # 共有方法,子类继承就可以了    def run(self):        print(self.name + 'running')    # 抽象方法:子类必须重写    @abc.abstractmethod    def chi(self): pass    @abc.abstractmethod    def jiao(self): pass​class Dog(Quan):    def kanmen(self):        print(self.name + '看门')    def chi(self):        super().chi()        print(self.name + '狗粮')    def jiao(self):        print('汪汪汪')​class Wolf(Quan):    def bulie(self):        print(self.name + '捕猎')    def chi(self):        print(self.name + '肉')    def jiao(self):        print('嗷嗷嗷')​dog = Dog('来福')wolf = Wolf('呵呵')​dog.jiao()wolf.jiao()dog.run()wolf.run()
View Code

多态

# 多态:对象的多种状态 - 父类对象的多种(子类对象)状态​import abcclass People(metaclass=abc.ABCMeta):    def __init__(self, name):        self.name = name    @abc.abstractmethod    def speak(self): pass​class Chinese(People):    def speak(self):        print('说中国话')class England(People):    def speak(self):        print('说英国话')if __name__ == '__main__':    # 多态的体现:功能或是需求,需要父类的对象,可以传入父类对象或任意子类对象    #       注:一般都是规定需要父类对象,传入子类对象    def ask_someone(obj):        print('让%s上台演讲' % obj.name)  # 父类提供,自己直接继承        obj.speak()  # 父类提供,只不过子类重写了​    ch = Chinese('王大锤')    en = England('Tom')    # 传入Chinese | England均可以,因为都是People的一种状态(体现方式)    ask_someone(ch)    ask_someone(en)    # 传入str不可以,因为str的对象没有name和speak    # s = str('白骨精')    # ask_someone(s)    # p = People('kkk')

鸭子类型

# 需求:需要一个对象,该对象有name属性及speak方法,就可以作为一种状态的体现被传入def ask_someone(obj):    print('让%s上台演讲' % obj.name)    obj.speak()​# 鸭子类型:# 1.先规定:有什么属性及什么方法的类的类型叫鸭子类型# 2.这些类实例化出的对象,都称之为鸭子,都可以作为需求对象的一种具体体现class A:    # 能有自己特有的属性和方法,可以和B完全不一样,但是必须有鸭子类型规定的属性和方法,不然就不是鸭子类型    def __init__(self, name):        self.name = name    def speak(self):        print('说AAAA')class B:    # 能有自己特有的属性和方法,可以和A完全不一样,但是必须有鸭子类型规定的属性和方法,不然就不是鸭子类型    def __init__(self, name):        self.name = name    def speak(self):        print('说BBBB')ask_someone(B('B'))

反射

# 反射:通过字符串与类及类的对象的属性(方法)建立关联class A:    num = 10print(hasattr(A, 'num'))res = getattr(A, 'num', '默认值')print(res)delattr(A, 'num')print(setattr(A, 'tag', 10))# 类的属性类来操作​​class B:    def __init__(self, name):        self.name = nameprint(hasattr(b, 'name'))print(getattr(b, 'name', '对象的属性类不能获取'))delattr(b, 'name')print(setattr(b, 'age', 18))# 对象的属性对象来操作​​class C:    def fn(self):        print('fn')​    @classmethod    def func(cls):        print('func')​fn = getattr(C, 'fn')c = C()fn(c)  # 类获取对象方法调用时传入具体的对象​obj_fn = getattr(c, 'fn')obj_fn()  # 对象获取对象方法调用时不用传参​func = getattr(C, 'func')func()  # 类获取类方法调用时不需要传入参数

转载于:https://www.cnblogs.com/penghengshan/p/10756439.html

你可能感兴趣的文章
Yellow dog
查看>>
Python网络编程之协程
查看>>
趣学Python之弹球游戏第二阶段--向上运动
查看>>
过滤全文验证正则表达式的一个小程序
查看>>
Cacti的spine进程数引起的问题
查看>>
我的友情链接
查看>>
求一份oracle数据库实习、兼职的工作
查看>>
storm集群的监控
查看>>
Connector|OIM向IBM TDS推送账号(LDAP3)
查看>>
Linux例行性工作at,cron,进程管理
查看>>
vim批量添加删除注释的方法
查看>>
小成本对付宽带我世界实现有线/无线同时上网
查看>>
QT TableWidget应用笔记
查看>>
yum安装Apache Web Server后各个文件存放位置
查看>>
定制更友好的iptables防火墙
查看>>
做软件产品,一定要及时响应用户反馈,及时更新
查看>>
Exchange Server2013 系列:证书的配置
查看>>
以太网帧识别VLAN
查看>>
CloudStack+XenServer详细部署方案(1):方案规划设计
查看>>
php 防止爬虫设置
查看>>