核心语法-Python--Class语法04

核心语法-Python–Class语法04

类的继承性

什么是继承?
作为面向对象编程语言的一个重要特点和主要能力,继承是指类可使用现有类(父类)的所有功能,并在无须修改父类的情况下对现有功能进行扩展。
通过继承创建的新类被称为“子类”或“派生类”,被继承的类被称为“基类”、“父类”或“超类"。继承的过程就是从一般到特殊的过程。
Python的一个子类可继承一个或多个基类。如果只继承一个基类,则被称为”单继承“;如果继承两个或多个基类,则被称为“多继承”;如果子类3继承子类2,而子类2又继承子类1,则被称为"多重继承",但是,一般情况下,一个子类通常只有一个基类,要实现多继承,可采用多极继承(多重继承)。在考虑使用继承时,有一点必须加以注意,即两个类之间应该是“属于”关系。例如,雇员类Employee是人,管理者类也是人,因此。这两个类均可继承Person类(人类)。但是腿类Leg却不能继承Person类,因为腿类与人类之间没有属于与被属于的关系。子类继承父类的属性和方法,子类可使用父类的所有属性和方法。

class 子类(父类1[,父类2]):
    类体(定义属性和方法的语句块)

()内的父类可为一个或多个。如果是一个,则为单继承;如果是多个,则为多继承;如果省略,则父类默认为object,它是系统默认的所有类的基类。

类的单继承

单继承是指子类只继承一个父类。在单继承的情形下,子类只有一个基类。子类可继承和使用父类的所有属性和方法。

class Animal(object):
    def __init__(self,name,sex,classtype):
        self.name = name
        self.sex = sex
        self.classtype = classtype

    def describe(self):
        print("名称:{0}雌雄:{1}科类:{2}".format(self.name,self.sex,self.classtype))

#定义子类
class Bird(Animal):
    def __init__(self,name,sex,classtype,flyable):
        Animal.__init__(self,name,sex,classtype)
    #构造函数的继承,以继承父类的属性和方法
        self.flyable = flyable  #子类的属性

if __name__ == '__main__':
    b1 = Bird("maque","F",'BirdClass','fly')
    print(b1.name)
    b1.describe()

上述类。根据允许结果可分析到,子类并没有定义name属性和describe()方法,但是子类的实例b1可访问name属性、调用describe()方法,因为
它们是属于父类的。由此可见,子类的确继承了父类的属性和方法。

#案例:不继承父类构造函数的情形

#案例:不继承父类构造函数的情形
#定义父类
class Animal(object):
    def __init__(self,name,sex,classtype):
        self.name = name
        self.sex = sex
        self.classtype = classtype
    def describe(self):
        print("名:{0}性:{1}科:{2}".format(self.name,self.sex,self.classtype))
class Bird(Animal):
    def __init__(self,name,sex,classtype,flyable):
        self.flyable = flyable

if __name__ == '__main__':
    b1 =Bird('maque','F','birdclass','fly')
    print(b1.name)
    b1.describe()

"""
Traceback (most recent call last):
  File "D:/Python/pycharm/pycharm_code/Class_Python04.py", line 61, in <module>
    print(b1.name)
AttributeError: 'Bird' object has no attribute 'name'

原因:Bird对象并无属性name,这是因为子类并没有继承父类的name属性,子类自身也无name属性。由此可得出结论:要使子类继承父类的属性和方法,必须在子类
的构造函数中显式地调用父类的构造函数,此过程被称为构造函数的继承。
"""

构造函数的继承

#1、继承构造函数的第一种方式

父类名称.init(self,参数1,参数2)
其中,括号内的第一个参数必须为self,余下的参数即父类的实例属性。例如:Animal.init(self,name,sex,classtype)

要注意,当以这种方式调用时,第一个参数self必须被显式传递,它不会被隐式传递,即必须为self,如果被省略,则将报错;其余参数则为父类的实例属性,直接复制
父类的实例属性即可。
此方式既可被用在单继承场合,也可被用在多继承场合。

#2、继承构造函数的第二种方式

super(子类,self).init(参数1,参数2)
其中,内置函数super(子类,self)用于表示子类的父类,它有两个参数----子类与self;而__init__(参数1,参数2)为构造函数,与第一种方式不同的是,它不需要self
参数,所有参数均为父类的实例属性。

#关于继承的一个重要特性

class Animal(object):
    def __init__(self,name,sex,classtype):
        self.name = name
        self.sex = sex
        self.classtype = classtype
    def describe(self):
        print("I am father!")
#定义子类
class Bird(Animal):
    def __init__(self,flyable):
        self.flyable = flyable
if __name__ == '__main__':
    b1 = Bird('fly')
    b1.describe()

#案例

class ScaleConverter(object):
    def __init__(self,unit_from,unit_to,factor):
        self.unit_from = unit_from
        self.unit_to = unit_to
        self.factor = factor
    def description(self):
        return "Convert" + self.unit_from + 'to' + self.unit_to
    def convert(self,value):
        return value*self.factor

class ScaleAndOffsetConverter(ScaleConverter):
    def __init__(self,unit_from,unit_to,factor,offset):
        ScaleConverter.__init__(self,unit_from,unit_to,factor)
        self.offset = offset
    def convert(self,value):
        return value * self.factor+self.offset
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为风筝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值