多继承,封装,多态,super()方法,类的约束

多继承:

多继承就是一个类里有多个父类,父类也可以有多个爷爷类.从多个父类中继承属性跟方法.

类的分类:

python2.2之前,只有经典类,pythont2.2之后出现了新式类

经典类:不继承object类,多继承遵循深度优先,从左至右,一条路走到底

class A:
pass

新式类:继承object类,多继承遵循c3算法,mro方法.

class A(object):
pass

python3x版本只有新式类.

鸭子类型:两个结构类似,有弱关联关系的函数或者类.

mro方法:(面试会考)

计算要点:表头不在所有元素的表位中,提取出整个列表的所有表头,即使表头在其他元素中也要提取出来

表头在所有元素的末尾,跳过此元素进行下一个元素的表头表位筛选.

merge([A,(B,C)]) = [A] + merge(mro(B),mro(C),[B,C])

mro(B) =mro(B,(D,E)) = [B] +merge(mro(D),mro[E])

mro(D(O)) = [D,O]

mr(E(O)) = [E,O]

mroB(D,E) = [B] + merge([D,O],[E,O],[D,E])

表头D不在所有元素的表位中,提取出整个列表的所有表头,即使表头在其他元素的表头[D,E]中也要提取出来

     = [B,D] + merge([O],[E,O],[E])

表头在所有元素的末尾,跳过此元素进行下一个元素的表头表位筛选.

     = [B,D,E,O]

以下同理详细计算

mro(C) = mro(C(E,F)) = [C] + merge(mro(E),mro(F),[E,F])
mro(C) = mro(C(E,F)) = [C] + merge([E,O],[F,O],[E,F])
= [C,E] + merge([O],[F,O],[F])
= [C,E,F] + merge([O],[O])
= [C,E,F,O]

mro(A(B,C)) = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])
= [A,B] + merge([D,E,O],[C,E,F,O],[C])
= [A,B,D] + merge([E,O],[C,E,F,O],[C])
= [A,B,D,C] + merge([E,O],[E,F,O])
= [A,B,D,C,E] + merge([O],[F,O])
= [A,B,D,C,E,F] + merge([O],[O])
= [A,B,D,C,E,F,O]

在实际工作中,可以直接使用.mro()方法去查看继承顺序

class O:
pass

class D(O):
pass

class E(O):
pass

class F(O):
pass

class B(D,E):
pass

class C(E,F):
pass

class A(B,C):
pass

obj = A()
print(A.mro())

封装 函数,模块,类,对象
class A:
def __init__(self,name,age):
self.name = name
self.age =age

obj = A(‘西门‘,18)
print(obj.name)
print(obj.age)

多态
python默认支持多态.
一个事物有用多种形态
水: 固态,液态,气态.
人: 正常,变态.
变形金刚: 汽车人,机器人等.
a = ‘fdasf‘
a = 100
a = [1,2,3]

def func(a):
print(a)

java
int a = 100
int a = ‘alex‘

def func(str a):
print(a)

class F1:
pass

class S1(F1):

def show(self):
print(‘S1.show‘)

class S2(F1):

def show(self):
print(‘S2.show‘)

# # 由于在Java或C#中定义函数参数时,必须指定参数的类型
# # 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# # 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
"""Func函数需要接收一个F1类型或者F1子类的类型"""
obj.show()

鸭子类型: 看着像鸭子,就是鸭子.
python 处处都是鸭子类型.

class A:
def add(self):
print(‘增加‘)

def delete(self):
print(‘删除‘)

class B:
def add(self):
print(‘这也是增加‘)

def delete(self):
print(‘这也是删除‘)

def update(self):
pass
obj1 = A()
obj1.add()
obj2 = B()
obj2.add()

两个类虽然没有任何关系,但是隐形中遵循了一个标准.
1, 统一标准,减少词汇量,
2, A和B没有任何耦合性,但是可以产生关系A的对象会使用B类的方法.

str :index
list index
tuple : index

dict: pop clear
list: pop clear

Super()方法:

super 可以执行非本方法的方法

class A:
def func1(self):
print(‘in A func1‘)

def func2(self):
print(‘in A func2‘)

class B(A):
def func1(self):
print(‘in B func1‘)
super().func2()

obj = B()
obj.func1()

super() 是完全按照mro的顺序执行的.

class A:
def func1(self):
print(‘in A func1‘)

class B(A):
def func1(self):
print(‘in B func1‘)

class C(A):
def func1(self):
print(‘in C func1‘)

class D(B,C):
def func1(self):
super().func1()
print(‘in D func1‘)

obj = D()
obj.func1()

super 是完全按照对象所在类的mro的顺序执行的.
class A:
def func1(self):
print(‘in A func1‘)

class B(A):
def func1(self):
super(B,self).func1()
print(‘in B func1‘)

class C(A):
def func1(self):
print(‘in C func1‘)

class D(B,C):
def func1(self):
super(D,self).func1()

super(X,self).
# 跳过X类,按照mro顺序执行下一个类
print(‘in D func1‘)

obj = D()
obj.func1()
A B D 错误
C B D 正确
print(D.mro()) # D,B,C,A

# class A:
# def func1(self):
# print(‘in A func1‘)

# class B(A):
# def func1(self):
# super(B,self).func1()
# print(‘in B func1‘)

# class C(A):
# def func1(self):
# print(‘in C func1‘)

# class D(B,C):
# def func1(self):
# super(B,self).func1()
# print(‘in D func1‘)

obj = D()
obj.func1()
D B C A

class A:
def func1(self):
print(‘in A func1‘)

class B(A):
def func1(self):
print(‘in B func1‘)

class C:
def func1(self):
print(‘in C func1‘)

class D(B,C):
def func1(self):
super(B,self).func1()
print(‘in D func1‘)

obj = D()
obj.func1()
print(D.mro()) # D B A C

类的约束:(还没弄明白)

原文地址:https://www.cnblogs.com/antigeneral/p/10324776.html

时间: 2024-08-29 13:45:18

多继承,封装,多态,super()方法,类的约束的相关文章

JavaScript基础--面向对象三大特性(八):继承封装多态

一.构造函数基本用法:function 类名(参数列表){属性=参数值} 1 function Person(name,age){ 2 this.name = name; 3 this.age = age; 4 } 5 6 //创建Person对象的时候,可以直接给名字和年龄 7 var p1 = new Person('abc',80); 8 window.alert(p1.name); 9 var p2 = new Person('hello',9); 10 window.alert(p2.

练习目标:继承、多态、方法的重写。

练习目标:继承.多态.方法的重写. 在本练习中,将在银行项目中创建Account的两个子类:SavingAccount 和 CheckingAccount. 创建 Account类的两个子类:SavingAccount(存款账户) 和 CheckingAccount(透支账户)子类 1.修改Account类:将balance属性的访问方式改为protected2.创建 SavingAccount 类,该类继承Account类3.该类必须包含一个类型为double的interestRate(利率)

封装,多态,继承. super的方法,类的约束,

1.python的三大特性:python的三大特性,封装,多态,继承封装:函数 模块 类 对象多态 : python中默认支持多态继承: python中的子类继承父类属性和方法 鸭子类型: 看着像鸭子,它就是鸭子python中处处都是鸭子 # 两者之间没有任何关系,但是都遵循着一个隐形的标准两个类中的鸭子类型:# 优点:1,统一标准,减少了词汇量# 2,两者之间没有任何耦合性,但是可以产生关系,其中一个的对象可以调用另一个类的方法# 其他例子 :index pop clear 2. super的

类的相关知识(封装、继承、多态、方法、构造方法、接口、抽象类、静态方法、静态变量等)

类 通过抽象,得到的某一个事物的共同特征. 1.类是抽象的,概念的,代表一类事物,比如人类,猫类-- 2.对象是具体的,实际的,代表一个具体事物 3.类是对象的模板,对象是类的一个个体,实例 class Cat           // Java中类名的首字母大写 { //下面的就是类的成员变量.属性 Int age; String name; String color; } 类的结构: Package 包名: Class 类名 extends 父类 implements 接口名 { 成员变量(

面向对象的三大特征:继承 封装 多态

面向对象: 面向对象专注于由谁来解决这个过程,而调用者无需关注对象实现的细节 编程特点: 出现了一个个的类,从类中拿到对象,通过对象直接解决问题 类:具有一系列相同属性(特征)和方法(行为)的个体的集合 称为类 类是一个抽象的概念,只能说类具有哪些属性而不能直接对类进行赋值 例如 人类有身高这个属性,但是不能说人类的身高是180 对象:从类中拿出具有具体属性值的个体,称为对象 对象是从类中拿出的一个具体的个体,需要对属性进行具体的赋值 例如 人类有身高这个属性,张三是人类的一个个体,就可以说张三

继承、多态及方法重写、重载

1.多态: 多态指的是同一个方法的调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现完全不同. 多态的要点: (1)多态是方法的多态,不是属性的多态(多态与属性无关): (2)多态的存在要有3个必要条件:继承.方法重写.父类引用指向子类对象: (3)父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了. /** * - - - (1)多态是方法的多态,不死属性的多态(多态与属性无关): * - - - (2)多态的存在要有3个必要条件:继承.方法重写.父类

继承 封装 多态 简单介绍

面向对象的程序设计有三个主要特征,如: 封装性 ? 继承性 ? 多态性 封装: 不需要让外界知道的信息隐藏起来有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓:或只允许使用对象的功能,而尽可能隐蔽对象的功能实现细节. 继承: 首先拥有反映事物一般特性的类,然后在其基础上派生出反映特殊事物的类 多态: 多态是允许程序中出现重名现象. Java 语言中含有方法重载与成员覆盖两种形式的多态. 方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不

面向对象之:封装,多态,以及类的约束

1.封装 把很多数据封装到?个对象中. 把固定功能的代码封装到?个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了?个很?B的函数. 那这个也可以被称为封装. 在?向对象思想中. 是把?些看似?关紧要的内容组合到?起统?进?存储和使?. 这就是封装. 顾名思义就是将内容封装到某个地方,以后再去调用被封装的内容 封装的步骤 将内容封装到某处 class A: def __init__(self,name): self.name=name self.

C#类的运用,继承,多态,方法重写

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ObjTest{ class Program { static void Main(string[] args) { //car a = new car(); //a.name = "bmw"; //a.run(); //car b = new car(); //b.name = "lbjn&