Python面向对象编程之继承与多态详解Python面向对象编程之继承与多态详解
本文实例讲述了Python面向对象编程之继承与多态 。分享给大家供大家参考 , 具体如下:
Python 类的继承
在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class) 。
我们先来定义一个class Person,表示人,定义属性变量 name 及 sex (姓名和性别);
定义一个方法print_title():当sex是male时,print man;当sex 是female时,print woman 。参考如下代码:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):# Child 继承 Person
pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)# 子类继承父类方法及属性
May.print_title()
Peter.print_title()
而我们编写 Child 类 , 完全可以继承 Person 类(Child 就是 Person);使用 class subclass_name(baseclass_name) 来表示继承;
继承有什么好处?最大的好处是子类获得了父类的全部属性及功能 。如下 Child 类就可以直接使用父类的 print_title() 方法
实例化Child的时候,子类继承了父类的构造函数 , 就需要提供父类Person要求的两个属性变量 name 及 sex:
在继承关系中,如果一个实例的数据类型是某个子类,那它也可以被看做是父类(May 既是 Child 又是 Person) 。但是 , 反过来就不行(Peter 仅是 Person,而不是Child) 。
继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系 。而任何类 , 最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树 。比如如下的继承树:
isinstance()及issubclass()
Python 与其他语言不同点在于,当我们定义一个 class 的时候,我们实际上就定义了一种数据类型 。我们定义的数据类型和Python自带的数据类型 , 比如str、list、dict没什么两样 。
Python 有两个判断继承的函数:isinstance() 用于检查实例类型;issubclass() 用于检查类继承 。参见下方示例:
class Person(object):
pass
class Child(Person):# Child 继承 Person
pass
May = Child()
Peter = Person()
print(isinstance(May,Child))# True
print(isinstance(May,Person))# True
print(isinstance(Peter,Child))# False
print(isinstance(Peter,Person))# True
print(issubclass(Child,Person))# True
Python 类的多态
在说明多态是什么之前,我们在 Child 类中重写 print_title() 方法:若为male,print boy;若为female,print girl
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):# Child 继承 Person
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()
当子类和父类都存在相同的 print_title()方法时,子类的 print_title() 覆盖了父类的 print_title(),在代码运行时,会调用子类的 print_title()
这样,我们就获得了继承的另一个好处:多态 。
多态的好处就是,当我们需要传入更多的子类,例如新增 Teenagers、Grownups 等时,我们只需要继承 Person 类型就可以了,而print_title()方法既可以直不重写(即使用Person的),也可以重写一个特有的 。这就是多态的意思 。调用方只管调用 , 不管细节,而当我们新增一种Person的子类时,只要确保新方法编写正确,而不用管原来的代码 。这就是著名的“开闭”原则:
对扩展开放(Open for extension):允许子类重写方法函数
对修改封闭(Closed for modification):不重写 , 直接继承父类方法函数
子类重写构造函数
子类可以没有构造函数 , 表示同父类构造一致;子类也可重写构造函数;现在,我们需要在子类 Child 中新增两个属性变量:mother 和 father,我们可以构造如下(建议子类调用父类的构造方法,参见后续代码):
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person):# Child 继承 Person
def __init__(self,name,sex,mother,father):
self.name = name
self.sex = sex
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
若父类构造函数包含很多属性,子类仅需新增1、2个,会有不少冗余的代码,这边,子类可对父类的构造方法进行调用,参考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person):# Child 继承 Person
def __init__(self,name,sex,mother,father):
Person.__init__(self,name,sex)# 子类对父类的构造方法的调用
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
多重继承
多重继承的概念应该比较好理解,比如现在需要新建一个类 baby 继承 Child,可继承父类及父类上层类的属性及方法,优先使用层类近的方法 , 代码参考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):
pass
class Baby(Child):
pass
May = Baby("May","female")# 继承上上层父类的属性
print(May.name,May.sex)
May.print_title()# 可使用上上层父类的方法
class Child(Person):
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
class Baby(Child):
pass
May = Baby("May","female")
May.print_title()# 优先使用上层类的方法
Python类的继承与多态详细介绍 类(Class): 用来描述具有相同的属性和方法的对象的集合 。
类变量:类变量在整个实例化的对象中是公用的 。类变量定义在类中且在函数体之外 。类变量通常不作为实例变量使用 。
类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用
self:self 代表的是类的实例,代表当前对象的地址 , 而 self.class 则指向类 。
类调用 Car.weight
实例化 car01=Car(5)
实例对象调用 car01.weght
我们在构造类时,Python3默认我们继承了object这个基类,我个人理解object就是个空的类 , 可以不用管为何要在括号中写上object,这是Python3的特性,在python2中如果你没有写object的话不会默认继承了object这个基类 。
同样的我们自己希望继承的父类只需要把objetc改为我们自己定义的类名即可 。子类中可以拥有父类中所有的公有属性和方法 , 但是可以通过在变量名前加下划线使其变为私有,这样子类就不可以访问父类中的成员了 。
以下三个公交车类的父类均为客车类,我们可以写一个funcs方法使得每次调用funcs方法时,传入不同的对象以执行不同的func方法,具体实现如下:
主函数 :
可以看到 , 我将小 汽车 实例化为带有重量为5t的一个具体对象,将客车实例化为带有重量为20t的一个具体对象,将三个公交车实例化为带有重量为15t的一个具体对象.
如上图所示 , 我每次在调用funcs方法时都传入了一个实例化对象,funcs根据不同的对象执行相应的内部方法 。
Python中继承的理解与运用?9.5. 继承
当然,如果一种语言不支持继承就,“类”就没有什么意义 。派生类的定义如下所示:
class DerivedClassName(BaseClassName):
命名 BaseClassName (示例中的基类名)必须与派生类定义在一个作用域内 。除了类 , 还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
派生类定义的执行过程和基类是一样的 。构造派生类对象时,就记住了基类 。这在解析属性引用的时候尤其有用:如果在类中找不到请求调用的属性,就搜索基类 。如果基类是由别的类派生而来,这个规则会递归的应用上去 。
派生类的实例化没有什么特殊之处: DerivedClassName() (示列中的派生类)创建一个新的类实例 。方法引用按如下规则解析:搜索对应的类属性,必要时沿基类链逐级搜索,如果找到了函数对象这个方法引用就是合法的 。
派生类可能会覆盖其基类的方法 。因为方法调用同一个对象中的其它方法时没有特权 , 基类的方法调用同一个基类的方法时,可能实际上最终调用了派生类中的覆盖方法 。(对于 C程序员来说,Python 中的所有方法本质上都是 虚 方法 。)
派生类中的覆盖方法可能是想要扩充而不是简单的替代基类中的重名方法 。有一个简单的方法可以直接调用基类方法,只要调用: BaseClassName.methodname(self, arguments) 。有时这对于客户也很有用 。(要注意只有 BaseClassName 在同一全局作用域定义或导入时才能这样用 。)
Python 有两个用于继承的函数:
函数 isinstance() 用于检查实例类型: isinstance(obj, int) 只有在 obj.__class__ 是 int 或其它从 int 继承的类型
函数 issubclass() 用于检查类继承: issubclass(bool, int) 为 True,因为 bool 是 int 的子类 。
然而,issubclass(float, int) 为 False , 因为 float 不是 int 的子类 。
python 继承可能python继承函数教学你有C的基础吧python继承函数教学,C确实可以不用带上this 。我把python继承函数教学你的代码稍微改python继承函数教学了一下,你可以分别看看cls1.n、cls2.n、self.n的输出 。class cls1: n=3 class cls2(cls1): def __init__(self,cls1=cls1): cls2.n= 1 self.n= 2 print 'cls1.n:%s'%cls1.n print 'cls2.n:%s'%cls2.n print 'self.n:%s'%self.n cls2() print 'cls1.n:%s'%cls1.n 可以看出两个类和一个对象都可以在这里调用它们的n属性 , 如果只敲一个n别人读你的代码时就比较容易产生岐义,虽然少打了5个字符 , 但是不符合简单明确的pythonic哲学 。当然你也可以就认为python语法规则就是这么规定的 。
Python子类继承,如果不用父类的函数和方法 , 应该怎么写?子类继承父类时,如果父类有需要初始化的属性,那么必须在子类中调用父类的初始化方法,帮助父类进行初始化,否则,子类可以不调用父类的初始化方法
代码示例
"""
父类Car中没有属性需要初始化,所有子类中也不需要调用父类的初始化方法
"""
class Car:
def show_name(self):
print('car name')
class EeleCar(Car):
pass
car = EeleCar()
car.show_name()
python继承父类 怎么引用子类调用父类函数有以下方法python继承函数教学:
直接写类名调用
用 super(type, obj).method(arg)方法调用 。
在类定义中调用本类的父类方法python继承函数教学 , 可以直接用super().method(arg)
class A:
def method(self, arg):
pass
class B(A):
def method(self, arg):
#A.method(self,arg)# 1
#super(B, self).method(arg)# 2
super().method(arg)# 3
【python继承函数教学 python继承的例子】关于python继承函数教学和python继承的例子的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 视频号秒杀上架多少钱啊,视频号怎么报价
- css中怎么设置字体加错,css中怎么设置字体加粗
- 黄冈专注sap售后服务,黄冈专注sap售后服务中心
- 直播检测账号工具,直播平台怎么检测违规的
- oracle如何写触发器 oracle触发器怎么调试
- 取款机c语言设计心得百度文库,c语言atm取款机设计程序框图
- mysql安装完成后修改编译参数,mysql安装后修改密码
- redis源不够,redis can not get resource
- oracle正则怎么写 oracle正则表达式用法