Python-面向对象 (二 继承)
class people:
#define attribute
name = ''
age = 0
#define private attribute
__weight = 0
def __init__(self,n="hello",a=24,w=45.9):
self.name = n
self.age = a
self.__weight = w
def __del__(self):
print("people deconstructor........")
def __repr__(self):
print("people class")
def speak(self):
print("%s is speaking: I am %d years old" % (self.name,self.age))
def weight(self):
print("Weight number:%d" % (self.__weight))
单重继承
grade = ''
def __init__(self,n,a,w,g):
people.__init__(self,n,a,w)
self.grade = g
def speak(self):
print("%s is speaking: I am %d years old,and I am in grade %d" % (self.name,self.age,self.grade))
def __del__(self):
print("student deconstructor......")
s.speak()
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("I am %s,I am a speaker!My topic is %s " % (self.name,self.topic))
def __del__(self):
print("speaker deconstructor.....")
class sample(speaker,student):
a = ''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
def __del__(self):
print ('sample deconstructor')
# speaker.__del__()
# student.__del__()
test = sample("Tim",25,80,4,"Python")
test.speak()
2. 假设须要在子类中调用父类的方法,须要以 父类名.方法 这样的方式调用,以这样的方式调用的时候,注意要传递self參数过去。
对于继承关系,子类继承了父类全部的公有属性和方法,能够在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来訪问的。
Python支持多重继承。对于多重继承,比方
class SubClass(SuperClass1,SuperClass2)
此时有一个问题就是假设SubClass没有又一次定义构造方法,它会自己主动调用哪个父类的构造方法?这里记住一点:以第一个父类为中心。假设SubClass又一次定义了构造方法,须要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;若SubClass没有又一次定义构造方法,则仅仅会运行第一个父类的构造方法。而且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。
本质上,多态意味着能够对不同的对象使用相同的操作,但它们可能会以多种形态呈现出结果。len(object)函数就体现了这一点。在C++、Java、C#这样的编译型语言中,因为有编译过程,因此就鲜明地分成了执行时多态和编译时多态。执行时多态是指同意父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法,这就是所谓的动态绑定。编译时多态有模板或范型、方法重载(overload)、方法重写(override)等。而Python是动态语言,动态地确定类型信息恰恰体现了多态的特征。在Python中,不论什么不知道对象究竟是什么类型,但又须要对象做点什么的时候,都会用到多态。
可以直接说明多态的两段演示样例代码例如以下:
1、方法多态
- # -*- coding: UTF-8 -*-
- _metaclass_=type # 确定使用新式类
- class calculator:
- def count(self,args):
- return 1
- calc=calculator() #自己定义类型
- from random import choice
- obj=choice(['hello,world',[1,2,3],calc]) #obj是随机返回的 类型不确定
- print type(obj)
- print obj.count('a') #方法多态
对于一个暂时对象obj,它通过Python的随机函数取出来,不知道详细类型(是字符串、元组还是自己定义类型),都能够调用count方法进行计算,至于count由谁(哪种类型)去做怎么去实现我们并不关心。
有一种称为”鸭子类型(duck typing)“的东西,讲的也是多态:
- _metaclass_=type # 确定使用新式类
- class Duck:
- def quack(self):
- print "Quaaaaaack!"
- def feathers(self):
- print "The duck has white and gray feathers."
- class Person:
- def quack(self):
- print "The person imitates a duck."
- def feathers(self):
- print "The person takes a feather from the ground and shows it."
- def in_the_forest(duck):
- duck.quack()
- duck.feathers()
- def game():
- donald = Duck()
- john = Person()
- in_the_forest(donald)
- in_the_forest(john)
- game()
就in_the_forest函数而言,參数对象是一个鸭子类型,它实现了方法多态。可是实际上我们知道,从严格的抽象来讲,Person类型和Duck全然风马牛不相及。
2、运算符多态
- def add(x,y):
- return x+y
- print add(1,2) #输出3
- print add("hello,","world") #输出hello,world
- print add(1,"abc") #抛出异常 TypeError: unsupported operand type(s) for +: 'int' and 'str'
上例中,显而易见,Python的加法运算符是”多态“的,理论上,我们实现的add方法支持随意支持加法的对象,可是我们不用关心两个參数x和y详细是什么类型。
Python相同支持运算符重载,实比例如以下:
- class Vector:
- def __init__(self, a, b):
- self.a = a
- self.b = b
- def __str__(self):
- return 'Vector (%d, %d)' % (self.a, self.b)
- def __add__(self,other):
- return Vector(self.a + other.a, self.b + other.b)
- v1 = Vector(2,10)
- v2 = Vector(5,-2)
- print v1 + v2
一两个演示样例代码当然不能从根本上说明多态。普遍觉得面向对象最有价值最被低估的特征事实上是多态。我们所理解的多态的实现和子类的虚函数地址绑定有关系,多态的效果事实上和函数地址执行时动态绑定有关。在C++, Java, C#中实现多态的方式通常有重写和重载两种,从上面两段代码,我们事实上能够分析得出Python中实现多态也能够变相理解为重写和重载。在Python中非常多内置函数和运算符都是多态的。
Python-面向对象 (二 继承)相关推荐
- Python面向对象简单继承
Python面向对象简单继承 python是面向对象的语言,它支持继承,即一个类可以继承父类那里属性和方法.本书代码源自<<Python 3 Object-Oriented Program ...
- Python面向对象二 封装与修饰器
Python面向对象二 封装与修饰器 1. 特殊方法 2. 封装 2.1 封装的引入 2.2 封装实例一 2.3 封装实例二 3. property装饰器 1. 特殊方法 • 在类中可以定义一些特殊方 ...
- 第八课.Python面向对象(二)
类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...
- 【python面向对象】继承与多态(二)
文章目录 内置可重写函数 __str__函数 __repr__函数 练习 运算符重载 定义 多继承 面向对象设计思想补充 里氏替换(继承后的重写) 迪米特法则(类与类交互的原则) 总结 内置可重写函数 ...
- Python 面向对象(二)类的继承
class people:#定义基本属性name = ''age = 0#定义私有属性,私有属性在类外部无法直接进行访问__weight = 0#定义构造方法def __init__(self,n,a ...
- Python面向对象之继承
面向对象三大特性 封装 根据职责将属性和方法封装到一个抽象的类中: 继承 实现代码的重用,西安通的代码不需要重复的编写: 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度. 单继承 ...
- Python 面向对象(二)
Python 的面向对象和其他语言不一样,python的class术语与c++有一定区别,与 Modula-3更像. 1 设计面向对象 设计分成下面的两个方面,一定要先设计,找好对象,找类 1 面向对 ...
- Python面向对象二(第十二讲)
文章目录 知识点 1.私有属性与私有方法 1.私有属性 2.私有方法 2.成员 3.实例属性 1.类属性(静态属性) 2.属性总结 4.实例方法 5.类方法 6.静态方法 7.封装介绍 8.继承(重点 ...
- python面向对象(part3)--继承
学习笔记 开发工具:Spyder 文章目录 继承 例子1 例子2(isinstance) 例子3(issubclass) 举个例子4(变量继承) 相关概念 继承 定义 可以重用现有类的功能与概念,并在 ...
- python面向对象二
继承介绍以及单继承 程序中的继承 在程序中,继承描述的是多个类之间的所属关系. 如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里. 那么类A就是基类,也叫做父类:类B就是派生类 ...
最新文章
- vant组件实现上传图片裁剪_如何用 120 行代码,实现交互完整的拖拽上传组件?...
- Linux函数名加数字,C++ 编译器的函数名修饰规则
- Apache POI和EasyExcel 第四集:Apache POI的Excel基本读取(分为03版的xls、07版的xlsx)
- kindeditor简单使用
- angularjs1-5,class,
- OSI(Open System Interconnect)开放式系统互联
- 2014——我们都任性过
- 易宝典文章——玩转Office 365中的Exchange Online服务 之二十八 怎样过滤病毒***邮件...
- OpenCV和java做人脸识别
- Java使用easyExcel操作Excel案例
- 盛大啊啊实打实倒萨的a
- 待得天晴花已老,不如携手雨中看
- C语言:实现蛇形数组
- windows10安装蓝牙驱动方法步骤
- Mux VLAN 原理
- 对v-for生成的元素添加不同的animate动画
- HDU - 6557 Justice
- 酷狗音乐Top500榜单爬取
- 计算机应用基础精品课程申报表,《计算机应用基础》精品课程申报书(修改意见).doc...
- 程序员如何进行职业规划---未雨绸缪
热门文章
- PostgreSQL技术周刊第8期:用PostgreSQL 做实时高效搜索引擎
- Android Studio 中删除项目和项目找回------ Project Structure的使用
- python之if和while控制流
- phpstorm常用设置
- VMware虚拟产品简介
- 对冲基金BKCM LLC创始人看涨BCH
- ZOJ 2561 Order-Preserving Codes(四边形优化DP)
- vue2.0 rem运行环境搭建
- 开发人员学Linux(10):CentOS7安装配置代码质量管理平台SonarQube6.4
- Microsoft Azure部署MYSQL-MMM(3)配置MYSQL-MMM