一、继承

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--面向对象继承】的更多相关文章

  1. OC面向对象—继承

    OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...

  2. 面向对象继承实例(a如何继承b)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. js面向对象继承

    前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...

  4. Php面向对象 – 继承和重写

    Php面向对象 – 继承和重写 承受: php于,通过类.使用特殊的经营宗旨. 通过定义类,采用extends来表示当前的类对象继承该类的对象. 样例: class C { public  $p_c  ...

  5. Java面向对象 继承(下)

     Java面向对象   继承(下) 知识概要:               (1)抽象类 1.1 抽象类概述                            1.2 抽象类的特点       ...

  6. Java面向对象 继承(上)

       Java面向对象 继承 知识概要:         (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...

  7. js高级-面向对象继承

    一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...

  8. 面向对象 继承 抽象类 接口 static 权限修饰符

    Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...

  9. Python之面向对象继承和派生

    Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...

  10. javaScript面向对象继承方法经典实现

    转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...

随机推荐

  1. mybatis之注解式开发之关联查询

    package com.bjsxt.mapper; import org.apache.ibatis.annotations.Select; import com.bjsxt.pojo.Clazz; ...

  2. Python全栈-day2-day3-语法基础1

    1.什么是变量,为什么需要变量 变量即变化的量,衡量现实中实物的状态:程序执行的本质就是一系列的状态变化,变是程序本身执行的直接体现,因此程序的执行需要这种机制将执行状态以及状态的变化保存下来. 1) ...

  3. html5-css选择器

    /*/**{color: red}p{color: green}#div1{background: blue;padding-top: 15px;}.kk{background: blue;borde ...

  4. sitecore系统教程之部署架构方式分析

    当您第一次部署Sitecore体验平台时,您可以选择三种主要体系结构选项: 内部部署服务器解决方案 混合服务器方案 云服务器解决方案 您是选择将Sitecore作为云,内部部署还是混合解决方案运行,取 ...

  5. verilog代码基础

    verilog拼接符用法: https://zhidao.baidu.com/question/531343285.html wire [31:0] bit_mask = { {8{be[3]}}, ...

  6. 转:【专题五】TCP编程

    前言 前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来介绍下传输层协议——TCP协议,主要介绍下TCP协议的工作过程和基于TCP协议的一个简单的通信程序,下面就开始本专题的正文了. ...

  7. linux下mysql 8.0忘记密码后重置密码

    1://免密码登陆 找到mysql配置文件:my.cnf, 在[mysqld]模块添加:skip-grant-tables   保存退出: 2://使配置生效 重启mysql服务:  service ...

  8. Shell变量相关

    li@ubuntu:~/test$ vi test.sh li@ubuntu:~/test$ cat test.sh #!/bin/bash #shell变量不加引号;加单引号;加双引号都行 url= ...

  9. POJ 1182 食物链 (种类并查集)

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说 ...

  10. RHEL7 CentOS7 的 firewall命令简单介绍

    firewall 服务介绍 firewall 服务是 redhat7 和 centos7 系统默认安装好的防火墙服务,一个信任级别的概念来管理与之相关联的连接与接口.它支持 ipv4 与 ipv6,并 ...