以下内容仅做自己学习使用,知识点内容来自柠檬班,转载请标记来源
@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