12:类的继承、重写、调用重新父类方法、属性动态设置

以下内容仅做自己学习使用,知识点内容来自柠檬班,转载请标记来源

@Author:木又
@File:demo1_继承.py
@Time:2020/7/29 21:07
@Name:Ta Quan Ge

类的定义形式:

class 类名:
    pass
    
class 类名(继承的父类)pass

object(基类):python中所有类的祖宗(所有的类都继承于他)

继承:子类通过能继承够拥有父类的属性和方法(__开头的私有属性和方法除外)

class MyTest:
    pass

class MyClass(object):
    pass

继承:子类通过继承能够拥有父类的属性和方法(__开头的私有属性和方法除外)

class BaseClass:
    attr = "base"

    def func(self):
        print("-----base----")


class MyClass(BaseClass):
    def func2(self):
        print("---子类自己的方法---")

m = MyClass()
print(m.attr)  # base
m.func() # -----base----
m.func2()  	#---子类自己的方法---

@Author:木又
@File:demo2_继承案例.py

‘’’
需求V1:实现一个初始版的手机类
只能打电话

需求V2:实现一个定义功能的手机类
打电话、听音与、发短信

需求V3:实现一个智能版的手机类
打电话、听音乐、发短信、看视频、手机支付、视频通话

‘’’

class BasePhone:
    def __init__(self,name):
        self.name = name

    def call_phone(self):
        print(f"{self.name}使用了打电话的功能")


class PhoneV2(object):
    def __init__(self, name):
        self.name = name

    def call_phone(self):
        print(f"{self.name}打电话的功能")

    def music(self):
        print(f"{self.name}音乐功能")

    def send_msg(self):
        print(f"{self.name}发短信功能")

#
class PhoneV3(object):
    def __init__(self,name):
        self.name = name

    def call_phone(self):
        print(f"{self.name}打电话的功能")

    def music(self):
        print(f"{self.name}音乐功能")

    def send_msg(self):
        print(f"{self.name}发短信功能")

    def pay(self):
        print(f"{self.name}支付功能")

    def video(self):
        print(f"{self.name}视频功能")

---------------------------继承模式-----------------------------
继承

class BasePhone:
    def __init__(self, name):
        self.name = name

    def call_phone(self):
        print(f"{self.name}使用了打电话的功能")


class PhoneV2(BasePhone):

    def music(self):
        print(f"{self.name}音乐功能")

    def send_msg(self):
        print(f"{self.name}发短信功能")


class PhoneV3(PhoneV2):

    def pay(self):
        print(f"{self.name}支付功能")

    def video(self):
        print(f"{self.name}视频功能")

@Author:木又
@File:demo3_重写父类方法.py
@Time:2020/7/29 22:16
@Name:Ta Quan Ge

重写父类方法:在子类中定义一个和父类同名的方法

在子类的方法中调用 被重写 的父类方法的方式:
法一: 1.父类名.方法名(self)

法二: 2.super().方法名()

注:父类是不能使用子类的方法和属性的

‘’’

class BasePhone:
    def __init__(self, name):
        self.name = name

    def call_phone(self):
        print(f"{self.name}使用了打电话的功能(父类方法)")


class PhoneV2(BasePhone):

    def music(self):
        print(f"{self.name}音乐功能")

    def send_msg(self):
        print(f"{self.name}发短信功能")

 # 重写父类方法
    def call_phone(self):
        # 法一: 1.父类名.方法名(self)  在子类的方法中调用被重写的父类方法
        BasePhone.call_phone(self)

        # 法二:2.super().方法名()
        super().call_phone()
        print(f"{self.name}使用了视频电话的功能")


p = PhoneV2("华为P30")
p.call_phone()     # 华为P30使用了打电话的功能(父类的方法)
                   # 华为P30使用了打电话的功能(父类的方法)
				   # 华为P30使用了视频电话的功能

@Author:木又
@File:demo4_调用重写父类方法案例.py
@Time:2020/7/29 22:30
@Name:Ta Quan Ge

在子类的方法中调用 被重写 的父类方法的方式:
1.父类名.方法名(self)

2.super().方法名()

应用场景:父类中原有的方法不能满足当前需求,需要对父类中的方法进行扩展

开放封闭原则:
已经实现的功能不要进行修改(对修改是封闭的)
对功能代码的扩展是开发的

class BasePhone:
    def __init__(self, name, boos):
        self.name = name
        self.boos = boos

    def call_phone(self):
        print(f"{self.name}使用了打电话的功能(父类方法)")


**重写属性,并调用父类中的对象属性**
**重写方法,并调用父类中的对象方法**
class PhoneV2(BasePhone):
    # 重写属性
    def __init__(self, name, boos, money):
        # 调用父类中的属性
        super().__init__(name, boos)
        # 重写之后扩展的属性
        self.money = money


 	def music(self):
        print(f"{self.name}音乐功能")

    def send_msg(self):
        print(f"{self.name}发短信功能")

    # 重写父类方法
    def call_phone(self):
        BasePhone.call_phone(self)  # 1.父类名.方法名(self)  在子类的方法中调用被重写的父类方法
        super().call_phone()  # 2.super().方法名()
        print(f"{self.name}使用了视频电话的功能")


p = PhoneV2("华为", "P30")
p.call_phone()    # 华为使用了打电话的功能(父类方法)
				  # 华为使用了打电话的功能(父类方法)
				  # 华为使用了视频电话的功能

   

@Author:木又
@File:demo5_属性动态设置.py
@Time:2020/7/29 22:43
@Name:Ta Quan Ge

动态设置属性
setattr(obj,属性名,属性值):
在代码执行的过程中给类/对象设置属性(属性不存在就是添加,存在就是修改)

getattr(obj,属性名,默认值):
在代码执行的过程中获取类/对象属性

delattr(obj,属性名):
在代码执行的过程中删除类/对象属性

class BasePhone:
    def __init__(self, name, boos):
        self.name = name
        self.boos = boos

    def call_phone(self):
        print(f"{self.name}使用了打电话的功能")



**动态设置属性**
setattr(obj,属性名,属性值):在代码执行的过程中给类/对象设置属性




# 动态设置类属性

```python
BasePhone.attr = "任正非"


简化上面的写法

```python
setattr(BasePhone, "attr", "任正非")  # <==> BasePhone.attr = "任正非"



**如何将变量的值设置为类的属性名?**


var = input("请输入属性名:")
value = 888
setattr(BasePhone, var, value)

print(BasePhone.attr)   # 任正非


**可以查看所有的属性**
print(BasePhone.__dict__)

p = BasePhone("华为", "P30")
# 给对象设置属性
setattr(p, "age", 999)
print(p.__dict__)   # {'name': '华为', 'boos': 'P30', 'age': 999}



'''
访问属性
getattr(obj,属性名,默认值):在代码执行的过程中获取类/对象属性

'''
p = BasePhone("华为","任正非")
# 需求:根据用户输入的属性名,获取对应的属性值
item  = input("请输入属性名:")   # boos
res = getattr(p, item)  # 如果不加None,打印是会报如下错误
print(res)   # AttributeError: 'BasePhone' object has no attribute 'haha'



# 如果输入的属性名没有怎么办?===》在getattr方法中传入None参数
p = BasePhone("华为","任正非")
# 需求:根据用户输入的属性名,获取对应的属性值
item  = input("请输入属性名:")
res = getattr(p,item,None)
print(res)


'''
属性删除
delattr(obj,属性名):在代码执行的过程中删除类/对象属性

'''
p = BasePhone("华为", "任正非")
# 需求:根据用户输入的属性名,获取对应的属性值
item = input("请输入属性名:")
delattr(p, item)
print(p.__dict__)  # 可以查看所有的属性


@Author:木又
@File:demo6_多继承(扩展).py
@Time:2020/7/30 21:36

多继承(了解即可)
一个类同时继承多个父类

‘’’

class Base:
    attr = 100

class User:
    attr1 = 200

class MyClass(Base,User):
    pass

print(MyClass.attr)  # 100
print(MyClass.attr1)  # 200
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值