【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 ...
随机推荐
- spring之拦截器
拦截器 实现HandlerInterceptor接口:注册拦截器<mvc:inteceptors> spring和springMVC父子容器的关系 在spring整体框架的核心概念中,容器 ...
- Spring中集合注入方法
集合注入重要是对数组.List.Set.map的注入,具体注入方法请参照一下代码(重点是applicationContext.xml中对这几个集合注入的方式): 1.在工程中新建一个Departmen ...
- hbase-java-api003(put list)
package api; import java.io.IOException; import java.util.ArrayList; import java.util.List; import o ...
- activiti_change_ok
package com.xinwei.process.controller; import java.util.Calendar; import java.util.HashMap; import j ...
- html常用文本标签(转)
内容一<br />内容二 让文本强制换行 内容一内容二 <p>段落一</p><p>段落二</p> 段落标签 段落一 段落二 <b> ...
- Python 模型定义 :通过pymysql和数据模型(models.py)创建mysql表及表结构
一.model的配置 1.创建数据库 2.安装pymysql 3.修改配置文件 数据库连接配置 DATABASES = { 'default': { 'ENGINE': 'django.db.back ...
- Oracle中找出用户的上次登录时间
可以使用如下sql语句: select t1.username,t1.logon_time last_logon_time,t2.account_status,created 账号创建时间 from ...
- 并发工具CyclicBarrier
想想一下这样一个场景,有多个人需要过河,河上有一条船,船要等待满10个人才过河,过完河后每个人又各自行动. 这里的人相当于线程,注意这里,每个线程运行到一半的时候,它就要等待一个条件,即船满过河的条件 ...
- Buffer、ArrayBuffer、DataView互转(node.js)
1.Buffer转ArrayBuffer // 实例一 const buf = Buffer.from("this is a test"); console.log(buf); c ...
- sitecore系统教程之内容编辑器
内容编辑器 内容编辑器是一种编辑工具,可用于管理和编辑网站上的所有内容.它专为熟悉Sitecore及其包含的功能的经验丰富的内容作者而设计. 内容编辑器的外观和功能取决于用户的角色,本地安全设置以 ...