python中类与对象之继承

面对对象的三大特性之继承

1.什么是继承?

在程序中,继承指的是class与class之间的关系

继承是一种关系,必须存在两个class才能产生这种关系;被继承的class称为父类,继承的class称为子类。

2.为什么要使用继承?

现实中,通过继承,子可以直接使用父的内容。

在程序中,通过继承,子类可以直接使用父类已有的代码

3.如何使用继承

#继承的定义
class Father1:
    x = 13
    print(‘这是父类的x‘, x)
    def coding(self):
        print(‘我是父类的对象的绑定方法coding‘)
    @classmethod
    def missing(cls):
        print(‘这是父类的绑定方法missing‘)
class Father2:
    y = 14
    print(‘这是父类Father的y‘, y)
class Son(Father1, Father2):
    pass
?
print(Son.x)
print(Son.y)
son1 = Son()
Son.coding(son1)
Son.missing()
son1.missing()
?
?
###输出结果
        13
        14
        我是父类的对象的绑定方法coding
        这是父类的绑定方法missing
#1.命名方式:
          在子类中类名加上括号,加上父类的名称即可
#2.在python中,一个子类可以有多个父类,多个父类在括号中用逗号隔开,这一点在其他语言中是不支持的。
#3.子类中的对象可以访问父类的属性和方法。
#4.子类可以调用父类的绑定方法

4.抽象

抽象:就是抽取公共的父类的方法

抽象的作用:抽取多个类中相同的方法和属性形成一个新的类

#应用如下:
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def eating(self):
        print(‘%s要吃饭‘ % self.name)
    def sleeping(self):
        print(‘%s要睡觉‘ % self.name)
?
class Child(Person):
    def crying(self, mom):
        print(‘%s今年%s岁会哭着找妈妈%s‘ % (self.name, self.age, mom.name))
?
class Adult(Person):
    def working(self, papa):
        print(‘%s会找老公%s‘ % (self.name, papa.name))
?
xiaoming = Child(‘xiaoming‘ , 2)
mom = Adult(‘jessic‘, 28)
papa = Adult(‘egon‘, 30)
xiaoming.crying(mom)
mom.working(papa)
xiaoming.eating()
xiaoming.sleeping()
?
###输出结果
xiaoming今年2岁会哭着找妈妈jessic
jessic会找老公egon
xiaoming要吃饭
xiaoming要睡觉
?
#总结:
1.通过继承,避免了重复代码的书写
2.通过抽象,避免了继承一些不该有的方法和属性
3.写继承时应该先抽象再继承
4.在抽取过程中,可能会有一些跟业务需求无关的类这是正常的,这些称为公共父类。
5.公共父类的作用是储存多个子类相同的属性和方法

5.派生

派生指的是子类继承父类,并且拥有自己独特的属性或技能,该子类称为派生。派生类一定是子类。

#为什么有派生类?
#因为子类可能有自己独特的属性需要添加
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def say_hi(self):
        print("hello my name is %s,i‘m %s years old" % (self.name, self.age))
?
class Student(Person):
    def __init__(self, name, age, adress):
        self.name = name
        self.age = age
        self.adress = adress
    def attend_class(self):
        print(‘%s家在%s,%s岁,要好好学习‘ % (self.name, self.adress, self.age))
?
daidai = Student(‘daidai‘, 26, ‘china‘)
daidai.say_hi()
daidai.attend_class()
hello my name is daidai,i‘m 26 years old
daidai家在china,26岁,要好好学习
?
#Student就是一个派生类
?

6.子类访问父类的方法和属性

在派生中,相同的初始化属性,相同部分写了重复代码

有两种方式可以让子类访问父类的方法和属性

class Student(Person):
    def __init__(self, name, age, adress):
        #第一种调用方式:在子类中重用父类方法。这种调用方式与继承关系无关
        Person.__init__(self, name, age)
        self.adress = adress

    def attend_class(self):
        print(‘%s家在%s,%s岁,要好好学习‘ % (self.name, self.adress, self.age))
?
daidai = Student(‘daidai‘, 26, ‘china‘)
daidai.say_hi()
daidai.attend_class()
?
###2.
class Student(Person):
    def __init__(self, name, age, adress):
        #第二种调用方式:利用super()
        #super()表示创建一个特殊对象,可用于调用父类
        super().__init__(name,age)
        # Person.__init__(self, name, age)
        self.adress = adress
    def attend_class(self):
        print(‘%s家在%s,%s岁,要好好学习‘ % (self.name, self.adress, self.age))
?
daidai = Student(‘daidai‘, 26, ‘china‘)
daidai.say_hi()
daidai.attend_class()
?
##了解
在python2中,super()的使用方法有所不同,需要写成:
super(Student, self).__init__(name, age)
#其中Student表示父类,self表示是对象本身

7.继承后子类的属性查找

class S:
    x = 1
?
class A(S):
    x = 2
?
class B(A):
    x = 3
?
b = B()
b.x = 4
print(b.x)
?
子类对象和对象的查找方法的查找顺序:
对象——>B(子类)——>A(父类)——>S(父类)
?
#如果一个子类有多个父类时查找顺序
#1.如果父类不存在自己的父类时,按照继承的顺序去查找BASC
#2.如果父类还有自己的父类时,则按照继承顺序沿一条线找到底(深度查找)
#3.如果存在两层关系还有公共关系时,会按照广度优先原则查找,也就是最后一层不会先找,先按照深度原则找完父类,然后再找父类的公共类
class C:
    x = 5
class S:
    x = 1
?
class A:
    x = 2
?
class B(A, S, C):
    x = 3
?
b = B()
b.x = 4
print(b.x)
?
?
#注意:
1.在经典类中,属性的查找只按照深度查找原则
2.只有在python2中才有经典类

8.经典类和新式类

所有直接继承或者间接继承object的类,都是新式类,object称之为根类,意思时所有类都是源自object类

  • 为什么这么设计?

    创建对象时,需要申请内存空间,创建新的名称空间,将对象的属性放入名称空间,这一复杂的基础操作都是由object完成的。简单来说就是object提供了一些常用的基础操作

注意:

1.在python3中,所有类都是object的子类,所有类都是新式类

2.在python2中,默认的是经典类,不会继承object

#区别
#python3中定义类
class Cls():
    print(‘python3中定义类‘)

#python2中
class Cls(Object):
    print(‘python2中定义类‘)
  • ——base——的作用

    class Cls():
        print(‘python3中定义类‘)
    Cls.__base__
    ?
    #Cls.__base__用于查看父类
    ?
    ?
    Cls.mor()
    .mor()显示属性列表

原文地址:https://www.cnblogs.com/5j421/p/10121421.html

时间: 2024-10-29 15:42:16

python中类与对象之继承的相关文章

Python中类和对象在内存中是如何保存?

类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类. 当通过 obj1 执行 [方法一] 时,过程如下: 根据当前对象中的 类对象指针 找到类中的方法 将对象 obj1 当作参数传给 方法的第一个参数 self 

python类与对象基本语法

本文和大家分享的主要是python中类与对象相关内容,一起来看看吧,希望对大家学习python有所帮助. 面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象. 定义一个类 class person: age=10 #下面sex没有进行初始化是会报错的 #sex name="intsmaze" def getPe

c/c++栏目中类和对象-4的python实现

# -*- coding: utf-8 -*- """ Created on Wed Jun 04 01:21:31 2014 @author: Administrator """ class Analysis: def processExamResults(self): passes = 0 failures = 0 studentCounter = 1 while(studentCounter<=10): result = input(

python进阶四(类的继承)【4-5 python中获取对象信息】

python中获取对象信息 拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例如,已有定义: 1 class Person(object): 2 def __init__(self, name, gender): 3 self.name = name 4 self.gender = gender 5 6 class Student(Person): 7 def __init__(self, name, gender, score

Python(面向对象编程——2 继承、派生、组合、抽象类)

继承与派生 ''' 继承:属于 组合:包含 一. 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). 继承有什么好处?最大的好处是子类获得了父类的全部功能. 继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构. 二. 组合指的是,在一个类中以另外一个类的对象作为数据属性,称

day14——类的一般形式、Python构造器、类的继承

类的一般形式 创建类我们一般用class关键字来创建一个类,class后面跟类名字,可以自定义,最后以冒号结尾,如下所示: class ClassName: '''类的说明''' 类的内容 类的内容可以写类的全局变量,方法等 下面举个例子: class ren(object): '''this class is abort ren class'''  #类的说明一定要三个引号引起来 name = 'meizi' sex = 'F' def hello(selfself): print('Hell

Python中的对象行为与特殊方法(一)对象的创建与销毁

Python中类调用__new__()类方法来创建实例,调用__init__()方法来初始化对象,对象的销毁则调用__del__()方法. __new__()方法第一个参数为类cls,通常返回cls的一个实例,然后新实例的__init__()方法将以类似于__init__(self[, ...])的方式被调用,self是创建的新的实例,其它的参数和传递给__new__()的参数一样. 如果__new__()方法不返回cls 的实例,那么__init__()将不会被调用. 对于一个类来说: cla

python面向对象三大特性之继承、多态

继承 什么是继承          所谓继承指提供了同一类对象共性的处理方法,子类继承父类共性的东西. 这样有利于代码的复用性,即子类拥有父类的方法.通过继承创建的新类称为"子类"或"派生类",被继承的类称为"基类"."父类"或"超类". 继承可以想象成什么是什么的关系 python中类的继承分为:单继承和多继承 class Parent1: # 父类1 pass class Parent2: #父类2 p

Python+Selenium进阶版(二)- Python中类/函数/模块的简单介绍

关于Python中类和函数及方法的调用,我们写在这个demo.py文件,具体代码如下: # coding = utf-8 class ClassA(object): string1 = "这是一个字符串." def insteancefunc(self): print('这是一个实例方法.') print(self) @classmethod def classfunc(cls): print('这是一个类方法.') print(cls) @staticmethod def stati