python自学篇十[ 面向对象 (二) :继承+多继承+类属性+实例属性]

python基础系列:
python自学篇一[ Anaconda3安装 ]
python自学篇二[ pycharm安装及使用 ]
python自学篇三[ 判断语句if的使用 ]
python自学篇四[ 基本数据类型和字符串常用处理 ]
python自学篇五[ 列表 ]
python自学篇六[ 元组 ]
python自学篇七[ 字典+深拷贝与浅拷贝 ]描述
python自学篇八[ 循环:while+for+pass+range()+推导式 ]
python自学篇九[ 函数(一):参数+对象 ]
python自学篇九[ 函数(二):返回值return+yield+迭代器+生成器 ]
python自学篇九[ 函数(三):变量作用域+ATM+5个小练习 ]
python自学篇九[ 函数(四):递归函数+匿名函数+内置函数+高阶函数 ]
python自学篇十[ 面向对象 (一) :面向对象概念+定义类+练习一]
python自学篇十[ 面向对象 (二) :继承+多继承+类属性+实例属性]
python自学篇十[ 面向对象 (三) :访问限制+类方法+静态方法]
python自学篇十[ 面向对象 (四) :王者荣耀小游戏+模拟一个简单的银行进行业务办理的类]
python自学篇十一[ 模块简介+模块制作+dir()函数+标准模块+包]
python自学篇十二[ 文件:打开+读取+写入+3个习题]

3.继承和多态

继承
  • 程序中定义一个class的时候,从现有的class继承,新class称之为子类(Subclass),被继承的class称为基类、父类或超类。
  • 子类继承了其父类的所有属性和方法,还可以定义自己的属性和方法。
#-*- conding:utf-8 -*-
class Animal():
    def __init__(self,name,food):
        self.name = name
        self.food = food

    def eat(self):
        print('%s爱吃%s'%(self.name,self.food))

#声明一个子类继承Animal
class Dog(Animal):
    # 加载父类构造方法
    def __init__(self,name,food,drink):
        # Animal.__init__(self,name,food,)
        super(Dog, self).__init__(name,food)
        self.drink = drink  #子类自己的属性

    #子类自己的方法
    def drinks(self):
        print('%s爱喝%s'%(self.name,self.drink))
class Cat(Animal):
    def __init__(self,name,food,drink):
        #加载父类构造方法
        # Animal.__init__(self,name,food,)
        super(Cat, self).__init__(name,food)
        self.drink = drink  #子类自己的属性

    #子类自己的方法
    def drinks(self):
        print('%s爱喝%s'%(self.name,self.drink))

    #重写父类的eat
    def eat(self):
        print('%s特别爱吃%s'%(self.name,self.food))
dog1=Dog('金毛','骨头','可乐')
dog1.eat()
dog1.drinks()
cat1 = Cat('波斯猫','秋刀鱼','雪碧')
cat1.eat()
cat1.drinks()

Python中多继承的语法格式如下:
class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
多继承例子:
class A():
    def a(self):
        print('我是A里面的a方法')

class B():
    def b(self):
        print('我是B里面的b方法')

    def a(self):
        print('我是B里面的a方法')

class C():
    def c(self):
        print('我是C里面的c方法')

class D(A,B,C):
    def d(self):
        print('我是D里面的d方法')

dd = D()
dd.d() #调用自己的方法
dd.c()
dd.a()

结果:

我是D里面的d方法
我是C里面的c方法
我是A里面的a方法

  • 注意圆括号中父类的顺序,如果继承的父类中有相同的方法名,而在子类中使用时未指定,python将从左至右查找父类中是否包含方法。

4.类属性与实例属性

属性

尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。实例属性在每创造一个类是都会初始化一遍,不同的实例的实例属性可能不同,不同实例的类属性都相同。

1:实例属性:

在__init__(self,…)中初始化

内部调用时都需要加上self.

外部调用时用“对象名.属性名”调用

2: 类属性:

在__init__()里初始化
    在内部用classname.类属性名调用
    外部既可以用classname.类属性名又可以用instancename.类属性名来调用

3:私有属性:

1:双下划线__开头:外部不可通过“对象名.属性名”来访问或者更改实际将其转化为了“_类名__属性名”

单下划线、双下划线、头尾双下划线说明
__foo__: 定义的是特殊方法,类似 __init__() 之类的。  
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问(创建的实例可以访问),不能用于 from module import *  
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值