【python38--面向对象继承】
一、继承
1、语法:class DerivedClassName(BaseClassName):子类继承父类
>>> class Parent:
def hello(self):
print('正在调用父类的方法。。。') >>> class Child(Parent):
pass >>> p = Parent()
>>> p.hello()
正在调用父类的方法。。。
>>> c = Child()
>>> c.hello()
正在调用父类的方法。。。
>>>
#子类Child继承了父类Parent,所以子类可以调用父类的方法c.hello()
2、如果子类中定义的方法和属性和父类的属性和方法名字一样,则会自动覆盖父类对应的方法和属性
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -=1
print('我的位置',self.x,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Salmon(Fish):
pass
class Shark(Fish):
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('吃货的梦想就是天天吃肉!')
self.hungry = False
else:
print('吃撑了!')
>>> fish = Fish()
>>> fish.move()
我的位置 4 7
>>> goldfish = Goldfish()
>>> goldfish.move()
我的位置 6 5
>>> carp = Carp()
>>> carp.move()
我的位置 7 6
>>> salmon = Salmon()
>>> salmon.move()
我的位置 -1 10
>>> shark = Shark()
>>> shark.move()
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
shark.move()
File "/Users/yixia/Desktop/fish.py", line 9, in move
self.x -=1
AttributeError: 'Shark' object has no attribute 'x'
---报错的原因:AttributeError: 'Shark' object has no attribute 'x' :Shark没有x的属性,shark继承了Fish,为什么会没有x的属性呢
原因:Shark重写了__init__的方法,就会覆盖父类Fish的__init__()方法中的x属性,即:子类定义类一个和父类相同名称的方法,则会覆盖父类的方法和属性
改正的代码:
两种方法:1,调用未绑定的父类方法 2、使用super()函数
实现的代码如下:
第一种:
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -=1
print('我的位置',self.x,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Salmon(Fish):
pass
class Shark(Fish):
def __init__(self):
Fish.__init__(self) #父类名称调用__init__()函数
self.hungry = True
def eat(self):
if self.hungry:
print('吃货的梦想就是天天吃肉!')
self.hungry = False
else:
print('吃撑了!')
>>> shark = Shark()
>>> shark.move()
我的位置 1 8
>>>
第二种:
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -=1
print('我的位置',self.x,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Salmon(Fish):
pass
class Shark(Fish):
def __init__(self):
super().__init__() #采用super()函数
self.hungry = True
def eat(self):
if self.hungry:
print('吃货的梦想就是天天吃肉!')
self.hungry = False
else:
print('吃撑了!')
>>> shark = Shark()
>>> shark.move()
我的位置 -1 6
#建议写super(),因为修改的话只要修改一个地方就够了,调用未绑定的父类关系就需要修改很多地方
3、如何屏蔽父类中的方法
--覆盖父类方法,子类中定义一个和父类一样的方法,函数内容体写成pass,这样父类的方法就没有任何反应了
>>> class Brid:
def fly(self):
print('翱翔在碧海蓝天之间。') >>> class Qie(Brid):
def fly(self):
pass >>> bird = Brid()
>>> bird.fly()
翱翔在碧海蓝天之间。
>>> qie = Qie()
>>> qie.fly() ---子类屏蔽了父类的fly()方法
4、定义一个点(Point)类和直线(Line)类,使用getLen方法可以获得直线的长度
提示:
*设定点A(X1,Y1),点B(X2,Y2),则亮点构成的直线长度|AB|=√((x1-x2)2+(y1-y2)2)
*Python中计算开根号可使用math模块中的sqrt函数
*直线需有亮点构成,因此初始化时需有两个点(Point)对象作为参数
思路:
1、直线的长度=两个点的x,y相减的平方和的开平方
mport math class Point():
def __init__(self,x,y):
self.x = x
self.y = y def getX(self):
return self.x def getY(self):
return self.y class Line():
def __init__(self,p1,p2):
self.x = p1.getX() - p2.getX()
self.y = p2.getY() - p2.getY()
self.len = math.sqrt(self.x*self.x + self.y*self.y) def getLen(self):
return self.len >>> p1 = Point(1,1)
>>> p2 = Point(4,5)
>>> line = Line(p1,p2)
>>> line.getLen()
5.0
【python38--面向对象继承】的更多相关文章
- OC面向对象—继承
OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...
- 面向对象继承实例(a如何继承b)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- js面向对象继承
前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...
- Php面向对象 – 继承和重写
Php面向对象 – 继承和重写 承受: php于,通过类.使用特殊的经营宗旨. 通过定义类,采用extends来表示当前的类对象继承该类的对象. 样例: class C { public $p_c ...
- Java面向对象 继承(下)
Java面向对象 继承(下) 知识概要: (1)抽象类 1.1 抽象类概述 1.2 抽象类的特点 ...
- Java面向对象 继承(上)
Java面向对象 继承 知识概要: (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...
- js高级-面向对象继承
一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...
- 面向对象 继承 抽象类 接口 static 权限修饰符
Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...
- Python之面向对象继承和派生
Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...
- javaScript面向对象继承方法经典实现
转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...
随机推荐
- 30.get和post的区别
POST和GET的区别 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个 ...
- ecshop 前台个人中心修改侧边栏 和 侧边栏显示不全 或 导航现实不全
怎么给个人中心侧边栏加项或者减项 在模板文件default/user_menu.lbi 文件里添加或者修改,一般看到页面都会知道怎么加,怎么删,这里就不啰嗦了 添加一个栏目以后,这个地址跳的页面怎么写 ...
- react native初识
开发的第一步就是搭建rn的开发环境,你可以去官网去查看教程也可以 点击 http://bbs.reactnative.cn/topic/10 进去查看window的开发环境安装的教程:注意:很关键的一 ...
- 原生js---ajax的封装插件.js---(对get和post做了兼容)
function ajax(method,url,data,fn){ // 1.创建对象 var xhr=null; try{ xhr=new XMLHttpRequest(); }catch(e){ ...
- quartz demo01
1,Pom.xml 加入:quartz-2.1.7.jar <dependency> <groupId>org.quartz-scheduler</groupId&g ...
- html utf-8 中文乱码
刚才用ajax从记事本中读文档的时候,发现在页面上显示是乱码. 页面编码:<meta charset="utf-8"> 搞半天最后发现是记事本编码格式的问题,记事本默认 ...
- Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的问题
Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的问题 今天闲来无事,准备搭一套SSM的环境,当然所有的jar包都用最新的. Mybatis使用3.4.6, ...
- eclipse 安装和使用AmaterasUML
1. 安装AmaterasUML前,需要先安装GEF(Eclipse Graphical Editing Framework (GEF)) 采用eclipse在线安装方式安装就好. a. 查看ecli ...
- MQ的使用场景
一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...
- TCP客户端图片上传服务端保存本地示例
//TCP客户端public class TCPClient { public static void main(String[] args)throws IOException { Socket s ...