python的类与继承


继承的定义及特点

继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。
特点:子类可以使用父类的属性(特征、技能)
继承是类与类之间的关系

类使用继承的作用
减少代码冗余、提高重用性

多态性

1、增加了程序的灵活性

以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

2、增加了程序可扩展性

通过继承animal类创建了一个新的类,使用者无需改变自己的代码 还是func(animal)去调用

类的继承

关于继承和多态性一切的核心都是类,那么接下来我们从类的建立开始说起

创建类与对象

面向对象中两个重要的概念:

1. :对一类事物的描述,是抽象的、概念上的定义。比如做汽车是所有车种类的一个大类
2.对象:实际存在的该类事物的每个个体,因而也称实例(instance)。比如小轿车
二者的关系:对象是由类派生的、创建的。一个类可以创建无穷多个对象,每个对象都属于类。

1.创建类,类主要由类名,属性,方法组成,当然创建一个类时,属性和方法可以选择的。
class Person:
    def cry(self):  #类方法:跟函数的定义类似,但是self参数自带的,这也是类的方法和普通方法的区别。
        print("I can cry")
    def speak(self):
        print("I can speak:%s"%(self.word)

---------创建对象-----------------------------------------------------------------------
tom =Person()  #创建对象,直接类名(),不用像java中还要new,所以python更加简洁
tom.cry()     #调用对象的方法
tom.word="hahah"
tom.speak()
tom.age =18  #给对象添加属性 ,属性不用在类定义时声明,但这种方法给对象赋值麻烦,每个对象都要赋值。
tom.age =19  #上面已经给tom添加过age属性,再次属于调用,重新赋值。
 
----------执行结果-------------------------------------------------------------------------
'''
I can cry
I can speak:hahah


2.给类初始化属性,在对象创建时就给对象设定了一些默认值。这样不用给每个对象都添加属性了,比如每个Person都是china,sex都是male.
 _init_(self)该类的方法有点类似java中类的构造器,可以给类的对象赋初始值。
------------------------------------------------------------------------------------------
class Person1:
    def __init__(self):  #_init_(self),主要给类初始化一些属性,对象创建时自动调用该方法执行
        self.country ="china"
        self.sex = "male"
 
    def speak(self):
        print("I am  from %s  ,wuwuwuwuu"%self.country)
-------------创建对象----------------------------------------------------------------------
jack = Person1()
jack.speak()
print(jack.country,jack.sex)
 
tom=Person1()
tom.speak()
print(tom.country,tom.sex)
--------------执行结果如下:----------------------------------------------------------------
'''
I am  from china  ,wuwuwuwuu
china male
I am  from china  ,wuwuwuwuu
china male
'''
 
3.属性虽然初始化了,但是固定死的,而实际每个对象的属性就不同。
  所以通过初始化时调用参数的形式,给每个对象赋不同的属性值
 
class Person2:
    def __init__(self,name,age): 
        self.age =age   #这种用法类似java中的this.age=age.self意思可以理解为当前对象
        self.name = name #表示将当前对象传进来的参数name的值赋给当前对象的属性name
        self.country = "china" #还是可以给类的每个对象都赋一个默认值。
 
    def speak(self):
        print("name=%s,age=%d"%(self.name,self.age))
-----------创建对象------------------------------------------------------------------------
p1 = Person2("allen",19)
p2 = Person2("sherry",22)
p3 = p2  #让p3=p2.对象的赋值
 
p1.speak()
p2.speak()
 
print("p1:",p1)  #直接打印对象 ,打印的是对象在内存中地址。
print("p2:",p2)
print("p3:",p3) #发现p3的地址跟p2的地址一样。
 
'''执行结果如下:
name=allen,age=19
name=sherry,age=22
p1: <__main__.Person2 object at 0x000001CBA3508BE0>
p2: <__main__.Person2 object at 0x000001CBA3508CF8>
p3: <__main__.Person2 object at 0x000001CBA3508CF8
————————————————
总结:
__init__()方法,在创建一个对象时默认被调用,类似Java中构造器。不需要手动调用
__init__(self)中,默认有1个参数名字为self,必须写。如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,age,name).第一个self不需要手动传参。 
__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去
python中一个类中只能有一个__init__方法,不支持该方法的重载(类似java中构造器的重载)
每一个对象 都有自己 独立的内存空间,保存各自不同的属性
多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用 传递到方法内部
————————————————

版权声明:本文为CSDN博主「牛大财有大才」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26442553/article/details/81744890

在这里插入图片描述
注意我标注的地方

A、 因为就在这个对话框中前面定义过父类,所以这里直接包括进去就行,否则要import模块

B、 我在使用构造函数初始化属性的时候,新加了一个属性student_number,见图中红色方框

表明子类Student现在一共需要传入self,persont_name,person_age,person_male,student_number这五个形参了,其中self不用我们手动传入;

C、 我们使用super()进行关联的时候,却没有出现student_number这个形参,这是因为父类里面本来没有这个属性,如图中绿线部分所示。所以我们没必要进行关联,只有子类有这个属性。

D、 我们这里重写了show_info()这个方法,

其实就算不写,也能在实例中直接用句点符号调用这个方法,因为我们继承了父类的所有方法,但是就不会有num这个输出了。所以我们重新定义了这个方法,这叫做覆写。就是把父类的方法给覆盖了。但是覆盖只是说使用子类来实例化的对象调用这个方法的时候用的是新的语句,比如下文的 H; 如果是父类实例化的对象,比如上文的teacher,调用这个方法,还是执行的父类的代码块。
————————————————
在这里插入图片描述
在这里插入图片描述
H成功接受了2018这个参数,而父类里是没有这个属性项的,

并且调用子类的新的show_info( )方法,成功打印出来了

博文推荐

https://www.cnblogs.com/CYHISTW/p/10966448.html
此篇针对python中类与继承描述的非常详尽,后续如果有需要会重新更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值