0
点赞
收藏
分享

微信扫一扫

Python基础day09【面向对象(封装、继承、多态)】

目录

00、复习和反馈

01、继承的基本语法[掌握]

02、单继承和多层继承[理解]

03、子类重写父类的同名方法[掌握]

04、子类调用父类的同名方法[掌握]

05、继承中的init[掌握]

06、多继承[理解]

6.1、多继承简单案例

6.2、多继承调用指定父类中的方法

07、私有权限[理解]

7.1、私有属性

7.2、私有方法

08、类属性[理解]

09、类方法

10、静态方法[掌握]

11、多态[理解]

12、鸭子类型中的多态

12、总结

13、试题讲解《python基础中期考试》


00、复习和反馈

01、继承的基本语法[掌握]

# 1.定义一个动物类:animal类
class Animal(object):
# 2.在animal类书写play方法,输出快乐地玩耍...
def play(self):
print('快乐地玩耍...')

# 3.定义Dog类继承animal类
class Dog(Animal):
pass

# 4.创建dog类对象,调用父类的方法
dog = Dog()
dog.play() # 快乐地玩耍...

02、单继承和多层继承[理解]

"""
单继承:如果一个类只有一个父类, 把这种继承关系称为单继承;
多继承:如果一个类有多个父类, 把这种继承关系称为多继承.
多层继承:C-->B-->A
"""


# 1. 定义一个动物类:animal类
class Animal(object): # 对于Animal类和object类来说,单继承
# 2. 在animal类书写play方法,输出‘快乐地玩耍...’
def play(self):
print('快乐地玩耍...')

# 3. 定义Dog类继承animal类
class Dog(Animal): # Dog-->Animal是单继承, Dog -->Animal-->object这种继承关系称为多层继承
def bark(self):
print('汪汪汪叫...')

# 定义类:XTQ类(哮天犬), 继承Dog类
# 多层继承中,子类可以使用所有继承链中的类中的方法和属性
class XTQ(Dog): # XTQ-->Dog:单继承;XTQ-->Dog-->Animal类:多层继承
pass

xtq = XTQ()
xtq.bark() # 调用父类Dog中的方法 汪汪汪叫...
xtq.play() # 调用爷爷类animal类中的方法 快乐地玩耍...

03、子类重写父类的同名方法[掌握]

# 1. 定义Dog类, 书写bark方法, 输出‘汪汪叫...’
class Dog(object):
def bark(self):
print('汪汪叫...')

# 2. 定义XTQ类继承Dog类,重写父类中的bark方法, 输出‘嗷嗷叫~~~’
class XTQ(Dog): # 哮天犬
def bark(self):
print('嗷嗷叫~~~')

dog = Dog() # 创建Dog类对象
dog.bark() # 父类自己的,汪汪叫...

xtq = XTQ() # 创建XTQ类对象
xtq.bark() # 嗷嗷叫~~~

04、子类调用父类的同名方法[掌握]

# 1. 定义Dog类, 书写bark方法, 输出 汪汪汪叫
class Dog(object):
def bark(self):
print('汪汪叫...')

# 2. 定义XTQ类,继承Dog类. 重写父类中的bark方法, 输出 嗷嗷嗷叫
class XTQ(Dog):
def bark(self):
print('嗷嗷叫~~~')
def see_host(self):
"""看见主人之后,要汪汪汪叫,不能嗷嗷叫"""
print('看见主人了,', end='')
self.bark() # 嗷嗷叫~~~
# 想要在子类中调用父类的同名方法

# 方法一: 父类名.方法名(self, 其他参数), 通过‘实例对象.方法名()’调用方法,不需要给self传递实参值,
# python解释器会自动将对象作为实参值传递给self形参,如果是通过类名.方法()调用,
# python解释器就不会自动传递实参值,需要手动给self形参传递实参值
Dog.bark(self) # 汪汪叫... 非常不推荐的方法:父类名(实参).方法名(),创建父类对象

# 方法二:super(类A, self).方法名(参数), 会调用当类A的父类中的方法
super(XTQ, self).bark() # 汪汪叫...,调用XTQ类父类中的bark方法

# 方法三:是方法二的简写, super().方法名(参数) ==> super(当前类, self).方法名()
super().bark() # 汪汪叫...

# 创建XTQ类对象
xtq = XTQ()
xtq.see_host()

05、继承中的init[掌握]

# 1.定义Dog类
class Dog(object):
def __init__(self, name):
# 添加属性
self.age = 0
self.name = name
def __str__(self):
return f'名字:{self.name}, 年龄:{self.age}。'

# 2.定义XTQ类继承Dog类
class XTQ(Dog):
# 子类重写了父类的__init__()方法,默认不再调用父类的__init__()方法, 需要手动地调用父类的__init__()方法
# 注意:子类init方法的形参,一般都先写父类的形参,再写子类自己独有的形参。
def __init__(self, name, color):
super().__init__(name)
self.color = color
def __str__(self):
return f'名字:{self.name};年龄:{self.age};毛色:{self.color}。'

# 3.创建XTQ类对象
xtq = XTQ('小黑', '红色')
print(xtq) # 名字:小黑;年龄:0;毛色:红色。

06、多继承[理解]

6.1、多继承简单案例

# 1.定义Dog类,定义bark方法和eat方法
class Dog(object):
def bark(self):
print('汪汪叫...')
def eat(self):
print('啃骨头...')

# 2.定义God类,定义play方法和eat方法
class God(object):
def play(self):
print('在云中飘一会...')
def eat(self):
print('吃蟠桃仙丹...')

# 3.定义XTQ类,继承Dog类和God类
# class XTQ(Dog, God): # XTQ类有两个父类,这种继承关系称为多继承,XTQ类对象可以调用两个父类中的属性和方法
class XTQ(God, Dog):
pass

# 4.创建XTQ类对象
xtq = XTQ()
xtq.bark() # 调用Dog父类中的方法,汪汪叫...
xtq.play() # 调用God父类中的方法,在云中飘一会...

xtq.eat() # 两个父类都存在eat方法,子类对象调用的是第一个父类中的方法,吃蟠桃仙丹...

6.2、多继承调用指定父类中的方法

# 1.定义Dog类,定义bark方法和eat方法
class Dog(object):
def bark(self):
print('汪汪叫...')
def eat(self):
print('啃骨头...')

# 2.定义God类,定义play方法和eat方法
class God(object):
def play(self):
print('在云中飘一会...')
def eat(self):
print('吃蟠桃仙丹...')

# 3.定义XTQ类,继承Dog类和God类
# class XTQ(Dog, God): # XTQ类有两个父类,这个继承关系称为多继承,XTQ类对象可以调用两个父类中的属性和方法
class XTQ(God, Dog): # XTQ类有两个父类,这个继承关系称为多继承,XTQ类对象可以调用两个父类中的属性和方法
def eat(self):
print('子类重写eat方法,调用子类自己的方法。')
# 调用指定父类中的方法
# 方法一:类名.方法名(self, 参数)
Dog.eat(self) # 啃骨头...
God.eat(self) # 吃蟠桃仙丹...

# 方法二:super(类A, self).方法名(参数):调用类A的父类(继承顺序链的下一个类)中的方法
super(XTQ, self).eat() # 调用God类中的方法,吃蟠桃仙丹...
super(God, self).eat() # 调用Dog类中的方法,啃骨头...
# super(Dog, self).eat() # 调用object类中的方法,注意: 但object类中没有eat方法,所以代码报错
print('子类重写eat方法,调用子类自己的方法。')

# 4.创建XTQ类对象
xtq = XTQ()
xtq.bark() # 调用Dog父类中的方法,汪汪叫...
xtq.play() # 调用God父类中的方法,在云中飘一会...

xtq.eat() # 两个父类都存在eat方法,子类对象调用的是第一个父类中的方法

# 类名.__mro__:可以查看当前类的继承顺序链,也叫做方法的调用顺序。不需要自己定义内容,自动定义内容。
print(XTQ.__mro__) # (<class '__main__.XTQ'>, <class '__main__.God'>, <class '__main__.Dog'>, <class 'object'>)

07、私有权限[理解]

7.1、私有属性

"""
私有属性:只需要在原属性名前加上两个下划线即可。
目的:保证数据的相对安全。
想要访问和使用私有属性:定义一个公有的方法,通过这个方法使用。
"""

# 案例需求: 定义People类,定义属性ICBC_money,钱不能随便被修改,必须是合法的终端才可以操作
class People(object):
def __init__(self):
# python中的私有本质是修改属性的名字,在创建对象的时候,会自动地修改属性名
# 在属性名的前边加上‘_类名前缀’
self.__ICBC_money = 0 # 定义私有属性
# 定义公有的方法,提供接口,修改余额
def get_money(self):
return self.__ICBC_money
def set_money(self, money):
num = input('输入金额:')
self.__ICBC_money += int(num)
# self.__ICBC_money += money

# 创建People类对象
xw = People() # 小王
# print(xw.__ICBC_money)
# 实例对象.__dict__:可以查看对象具有的属性信息,类型是字典,字典的key是属性名,字典的value是属性值
print('赋值之前:', xw.__dict__)
xw.__ICBC_money = 1000; # 不是修改私有属性,是重新添加一个公有属性
print('赋值之后:', xw.__dict__)
print(xw.__ICBC_money)

print('------------------------------------------------------')

print(xw.get_money()) # 0
xw.set_money(1000)
print(xw.get_money()) # 1000
xw.set_money(-500)
print(xw.get_money()) # 500

7.2、私有方法

"""
私有方法:在方法的前边加上两个__ ,就为私有方法。
私有方法:不能在类外部访问。
作用:一般作为类内部的方法使用,不让在外部直接调用,保证业务逻辑不被破坏。
"""

class Dog(object):
def born(self):
"""生小狗的方法,生一个小狗,休息30天"""
print('生了一只小狗...')
self.__sleep()
def __sleep(self):
print('休息30天~')

dog = Dog()
# dog.__sleep() # 报错
dog.born()

# 生了一只小狗...
# 休息30天~

08、类属性[理解]

"""
对象(实例对象):通过class定义的类创建的, 即通过类实例化来的, 又称为实例、实例对象。
实例对象定义的属性称为实例属性,通过实例对象(self)定义的属性都是实例属性。
实例属性:每个实例对象中都存在一份,并且值可能是不一样的。

类(类对象): 通过class定义的,又称为类对象, 是python解释器在创建类的时候自动创建的。
作用:1.通过类对象,去定义实例对象;2.类对象可以保存一些属性信息,称为类属性。
类属性的定义:在类内部,方法外部定义的变量就是类属性。
类属性在内存中只有一份。

如何确定一个属性是该定义为实例属性还是类属性?
先假设这个属性为实例属性,查看这个属性值对于不同的实例对象,属性值是否都一样,并且需要同时变化.
如果是,则可以定义为类属性;如果不是,则可以定义为实例属性。
"""

class Dog(object):
# 定义类属性, 类名
class_name = '狗类'
def __init__(self, name, age):
# 定义的都是实例属性
self.name = name
self.age = age

dog = Dog('大黄', 2) # 创建Dog类对象
print(dog.__dict__) # 打印dog对象具有的属性,{'name': '大黄', 'age': 2}

# 类名.__dict__:查看类对象具有的属性,__module__魔法属性
print(Dog.__dict__) # {'__module__': '__main__', 'class_name': '狗类', ...}

# 访问类属性:类名.类属性
print(Dog.class_name) # 狗类

# 修改类属性:类名.类属性 = 属性值
Dog.class_name = 'Dog类'
print(Dog.class_name) # Dog类

# 补充, 注意: 如果不存在和实例属性名相同的类属性,则可以使用实例对象访问类属性的值
# 如果存在重名,则使用实例属性访问的一定是实例属性,不是类属性
print(dog.class_name) # Dog类

09、类方法

"""
实例方法: 类中默认定义的方法就是实例方法,第一个参数为self,表示实例对象

类方法: 使用@classmethod装饰的方法,称为类方法,第一个参数是cls,代表的是类对象自己
什么情况定义为实例方法,什么情况定义为类方法?
1.如果在方法中使用了实例属性,那么该方法必须定义为实例方法;
2.前提:不需要使用实例属性.需要使用类属性,可以将这个方法定义为类方法.
"""

class Dog(object):
class_name = '狗类'

def __init__(self, name, age):
self.name = name
self.age = age

def play(self): # 实例方法
print(f"小狗{self.name},在快乐地玩耍...")

# def get_class_name(self): # 是实例方法,因为没有使用实例属性,所以可以定义为类方法
# return Dog.class_name
@classmethod
def get_class_name(cls): # cls是类方法的默认形参,在调用的时候,不需要手动传递,python解释器会自动传递
return cls.class_name


dog = Dog('大黄', 2)
dog.play() # 小狗大黄,在快乐地玩耍...
print(dog.get_class_name()) # 对象.类方法(),狗类
print(Dog.get_class_name()) # 类名.类方法(),狗类

10、静态方法[掌握]

"""
实例方法:类中默认定义的方法,就是实例方法,第一个参数为self,表示实例对象
类方法:使用@classmethod装饰的方法,称为类方法,第一个参数是cls,代表的是类对象自己
静态方法:使用@staticmethod装饰的方法,称为静态方法,对参数没有特殊要求,可以有,可以没有
什么情况定义为实例方法,什么情况定义为类方法,什么情况下静态方法?
1.如果在方法中使用了实例属性,那么该方法必须定义为实例方法;
2.前提:不需要使用实例属性.需要使用类属性,可以将这个方法定义为类方法;
3.前提:不需要使用实例属性,同时也不需要使用类属性,此时可以将这个方法定义为静态方法。
"""

class Dog(object):
class_name = '狗类'

def __init__(self, name, age):
self.name = name
self.age = age

def play(self): # 实例方法
print(f"小狗{self.name},在快乐地玩耍...")

@staticmethod # 定义静态方法。静态方法如果有参数,就必须传递实参值
def show_info():
print('这是一个Dog类!')


dog = Dog('大黄', 2)
dog.play() # 对象.方法名():小狗大黄,在快乐地玩耍...
dog.show_info() # 调用方法1:对象.方法名(),这是一个Dog类!
Dog.show_info() # 调用方法2:类名.方法名(),这是一个Dog类!

11、多态[理解]

"""
在需要使用父类对象的地方,也可以传入子类对象,得到不同的结果----多态
实现步骤:
1.子类继承父类;
2.子类重写父类中的同名方法;
3.定义一个共同的方法,参数为父类对象,在方法中调用子类和父类同名的方法.
"""

# 1.定义DOg类
class Dog(object):
def __init__(self, name):
self.name = name
def play(self):
print(f'小狗{self.name}, 在玩耍...')

# 2.定义哮天犬类,继承Dog类
class XTQ(Dog):
# 3.重写play方法
def play(self):
print(f'{self.name}, 在天上追云彩...')

# 4.定义一个共同的方法,
def play_with_dog(obj_dog):
obj_dog.play()

# 创建Dog类对象
dog = Dog('大黄')
play_with_dog(dog) # 小狗大黄, 在玩耍...

# 创建一个XTQ类的对象
xtq = XTQ('小黑')
play_with_dog(xtq) # 小黑, 在天上追云彩...

12、鸭子类型中的多态

# 1.定义DOg类
class Dog(object):
def __init__(self, name):
self.name = name
def play(self):
print(f'小狗{self.name}, 在玩耍...')

# 2.定义哮天犬类,继承Dog类
class XTQ(Dog):
# 3.重写play方法
def play(self):
print(f'{self.name}, 在天上追云彩...')

class Cat(object):
def __init__(self, name):
self.name = name
def play(self):
print(f'小猫{self.name}, 被撸中...')

# 4.定义一个共同的方法
def play_with_dog(obj_dog):
obj_dog.play()

# 创建Dog类对象
dog = Dog('大黄')
play_with_dog(dog) # 小狗大黄, 在玩耍...

# 创建一个XTQ类的对象
xtq = XTQ('小黑')
play_with_dog(xtq) # 小黑, 在天上追云彩...

# 创建一个猫类的对象
cat = Cat('小花')
play_with_dog(cat) # 小猫小花, 被撸中...

12、总结

13、试题讲解《python基础中期考试》

举报

相关推荐

0 条评论