python 30 面向对象之 多态

目录

  • 1,mixins机制
  • 2,子类派生的新方法中重用父类的功能
  • 3, 面向对象之--多态
  • 4,一些内置函数的介绍

1,mixins机制

多继承的正确打开方式:mixins机制

mixins机制核心:就是在多继承背景下尽可能地提升多继承的可读性

ps:让多继承满足人的思维习惯=》什么"是"什么

使用Mixin类实现多重继承要非常小心

首先它必须表示某一种功能,而不是某个物品,python 对于mixin类的命名方式一般以 Mixin, able, ible 为后缀

其次它必须责任单一,如果有多个功能,那就写多个Mixin类,一个类可以继承多个Mixin,为了保证遵循继承的“is-a”原则,只能继承一个标识其归属含义的父类

然后,它不依赖于子类的实现

最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了)


class Vehicle:
    pass

class FlyableMixin:
    def fly(self):
        pass

class CivilAircraft(FlyableMixin,Vehicle):  # 民航飞机
    pass

class Helicopter(FlyableMixin,Vehicle):  # 直升飞机
    pass

class Car(Vehicle):  # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
    pass

补充:通常Mixin结果的类放在左边

2,子类派生的新方法中重用父类的功能

方式一:指名道姓调用某一个类下的函数=》不依赖于继承关系


class OldboyPeople:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def f1(self):
        print(‘%s say hello‘ %self.name)

class Teacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):
        OldboyPeople.__init__(self,name,age,sex)

        self.level = level
        self.salary=salary

tea_obj=Teacher(‘egon‘,18,‘male‘,10,3000)
print(tea_obj.__dict__)

方式二:super()调用父类提供给自己的方法=》严格依赖继承关系

调用super()会得到一个特殊的对象,该对象会参照发起属性查找的那个类的mro,去当前类的父类中找属性


class OldboyPeople:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def f1(self):
        print(‘%s say hello‘ %self.name)

class Teacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):
        # super(Teacher,self).__init__(name,age,sex)
        super().__init__(name,age,sex) # 调用的是方法,自动传入对象

        self.level = level
        self.salary=salary

print(Teacher.mro())
tea_obj=Teacher(‘egon‘,18,‘male‘,10,3000)
print(tea_obj.__dict__)

super()案例


class A:
    def test(self):
        print(‘from A‘)
        super().test()

class B:
    def test(self):
        print(‘from B‘)

class C(A,B):
    pass

obj=C()
obj.test()

print(C.mro())

3, 面向对象之--多态

1、什么多态:同一事物有多种形态


class Animal:
    pass

class People(Animal):
    pass

class Dog(Animal):
    pass

class Pig(Animal):
    pass

2、为何要有多态=》多态会带来什么样的特性,多态性

多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象

class Animal: # 统一所有子类的方法

    def say(self):
        print(‘动物基本的发声频率。。。‘,end=‘ ‘)

class People(Animal):
    def say(self):
        super().say()
        print(‘嘤嘤嘤嘤嘤嘤嘤‘)

class Dog(Animal):
    def say(self):
        super().say()
        print(‘汪汪汪‘)

class Pig(Animal):
    def say(self):
        super().say()
        print(‘哼哼哼‘)

定义统一的接口,接收传入的动物对象

def animal_say(animal):
    animal.say()

animal_say(obj1)
animal_say(obj2)
animal_say(obj3)

print(‘hello‘.__len__())
print([1,2,3].__len__())
print({‘a‘:1,‘b‘:2}.__len__())

def my_len(val):
    return val.__len__()

print(my_len(‘hello‘))
print(my_len([1,2,3]))
print(my_len({‘a‘:1,‘b‘:2}))

len(‘hello‘)
len([1,2,3])
len({‘a‘:1,‘b‘:2})
  • python推崇的是鸭子类型
class Cpu:
    def read(self):
        print(‘cpu read‘)

    def write(self):
        print(‘cpu write‘)

class Mem:
    def read(self):
        print(‘mem read‘)

    def write(self):
        print(‘mem write‘)

class Txt:
    def read(self):
        print(‘txt read‘)

    def write(self):
        print(‘txt write‘)

了解:基类--强制统一父类标准

import abc

class Animal(metaclass=abc.ABCMeta): # 统一所有子类的标准
    @abc.abstractmethod
    def say(self):
        pass

obj=Animal() # 不能实例化抽象类自己

class People(Animal):
    def say(self):
        pass

class Dog(Animal):
    def say(self):
        pass

class Pig(Animal):
    def say(self):
        pass

4,一些内置函数的介绍

print(abs(-1)) #取绝对值
print(all([1,‘aaa‘,‘1‘])) #循环可迭代对象,所有的布尔值都为真才返回True
print(all([])) #循环可迭代对象,如果是空的则返回True

print(any([0,None,1])) #循环可迭代对象,任意一个布尔值为真返回True
print(any([]))  #循环可迭代对象,如果是空的则返回False

print(bin(11)) #十进制转2进制
print(oct(11)) #十进制转8进制
print(hex(11)) #十进制转16进制

print(bool(‘‘))

def func():
    pass
class Foo:
    pass
print(callable(Foo)) # 判断是否可被调用

print(chr(65)) #数字转asc码
print(ord(‘A‘))#asc码转数字

不可变集合
s=frozenset({1,2,3})

hash(不可变类型)

print(round(1.5))
print(round(1.4))

10 ** 2 % 3
print(pow(10,2,3))
s=slice(1,4,2)
l1=[‘a‘,‘b‘,‘c‘,‘d‘,‘e‘]
l2=[‘aaa‘,‘bbb‘,‘ccc‘,‘ddd‘,444]

print(l1[1:4:2]) # l1[s]
print(l2[1:4:2]) # l2[s]

=================》掌握
v1=‘hello‘
v2=[111,222,333,444,5555,6666]
res=zip(v1,v2)
print(list(res))

=================》掌握
print(divmod(10000,33))

=================》掌握
class Foo:
    pass
obj=Foo()
obj.xxx=1111
print(dir(obj)) # obj.哪些属性

=================》掌握
for i,v in enumerate([‘a‘,‘b‘,‘c‘]):
    print(i,v)

=================》掌握
res=eval(‘{"a":1}‘) # 执行字符串中的表达式
print(res,type(res))

=================》掌握
class Foo:
    pass
obj=Foo()
print(isinstance(obj,Foo))
print(isinstance([],list)) # 类型判断推荐使用isinstance
print(type([]) is list) # 不推荐使用

=================》掌握
import ‘time‘ # 错误
time=__import__(‘time‘)
time.sleep(3)

原文地址:https://www.cnblogs.com/Franciszw/p/12676460.html

时间: 2024-10-09 18:47:41

python 30 面向对象之 多态的相关文章

python基础--面向对象之多态

# 多态是指一类事物有多种行态, # 例如:动物有多种形态:人,狗,猫 # 他们有一些共同的特征:吃,喝,拉,撒 # 多态性是指在不考虑实例类型的情况下使用实例 # 对同一事物不同的类,对象有不同的响应, # 例如:放假了,有的同学回家,有的去旅游,有的去兼职 # 有的在敲代码(就是我啦) # 列表,字符串,字典都有len属性,但是是不同的执行过程. class Animal(): def talk(self): pass class People(Animal): def __init__(s

《Python》 面向对象三大特性之多态、封装

一.多态 1.什么是多态? 一个类表现出的多种状态:通过继承来实现的 在Java中的表现:在一个函数中需要给参数指定数据类型,如果这个地方可以接收两个以上类型的参数,那么这些类型应该有一个父类,这个父类是所有子类对象的类型. 在Python中:函数的参数不需要指定数据类型,所以我们也不需要通过继承的形式来统一一组类的类型,换句话说:所有的对象其实都是object类型,所有在Python当中处处是多态. # 多态指的是一类事物有多种形态 # 动物有多种形态:人,狗,猪 import abc cla

Python -面向对象(一 基本概念)

一 Python简单介绍 Python是一个可移植的面向对象的脚本语言. Python尽管是一个脚本语言,但也是一个全然面向对象的语言. 由于它设计之初把易用性做为很重要的一个考量标准,所以用起来很简洁,优美(语法很灵活).所以使用Python能够高速地编写出可执行代码.与C/C++相比.Python程序的执行速度比較慢,一门语言既然能够生存下来.就有它自己的原因,Python语言也一样. 当今的计算机处理速度已经很快.对某些任务来说.执行速度并非首要考虑的因素.比方说为了实现数据库訪问的自己主

黑马程序员——Java基础---面向对象之多态

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流!                                                                     面向对象之多态 一:多态的概念  多态性在实际中的含义就是不同的对象有相同的一般轮廓或形态,但具体执行的过程却大相径庭

Python 3面向对象编程

这篇是计算机类的优质预售推荐>>>><Python 3面向对象编程> 编辑推荐 本书不是Python 的入门书籍,适合具有Python 基础经验的开发人员阅读.如果你拥有其他面向对象语言的经验,你会更容易理解本书的内容. 内容简介 Python 是一种面向对象的解释型语言,面向对象是其非常重要的特性.本书通过Python 的数据结构.语法.设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则.本书不是Python 的入门书籍,

Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传参的子类类型 面向对象总结: 面向对象是一种编程方式,此编程方式的实现是基于类和对象的使用 类:是一个模板,模板中包含了多个函数共使用,即类中可包含多个函数(类中的函数即叫做方法) 一般疑问: 1)什么样的代码才是面向对象? 简单来说,如果程序中的所有功能否是由 “类”和“对象”实现,那么就是面向对

第八章:Python基础の面向对象(下集)

本課主題 面向对象的多态 面向对象的成员 成员修饰符 特殊成员 面向对象其他应用 源码扩展 异常处理 设计模式与单例模式 面向对象的多态 向对象的成员 普通字段保存在对象,静态字段保存在类里 对于静态字段来说,只要一加载,就会在内存中创建,静态方法是由你来调用的,对象是用来封装数据的,如果要用来封装数据,就创建对象.如果用不着对象就不用创建对象了,因為靜態方法的調用不依賴於任何對象,就可以节省內存空間.静态方法 = Python 的函数. Python 有三種方法 普通方法 静态方法,它是用類來

Python-面向对象(三 元编程)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

what&#39;s the python之面向对象

编程分为面向过程和面向对象,首先我们要了解什么是面向对象. 面向对象 面向过程就是我们之前学的内容,主要是函数式,其核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的