继承
面向对象编程中有一个重要的思想叫继承,子类通过继承可以获得父类的属性和方法,被继承的类叫做父类(基类),继承的类叫做子类。
作用:子类通过继承可以获得父类的属性和方法,提高开发的效率及代码的复用率。
-
1、类方法、静态方法、私有属性
类方法:使用@classmethod,第一个参数必须是当前类对象,第一个参数名一般约定为cls,通过他来传递类的属性和方法(不能传实例的属性和方法)
- 类方法第一个参数cls:代表的是类本身
类方法:可以由类去调用,也可以由实力对象去调用
实例方法:只能由实例对象去调用
# 类方法
class MyClass:
@classmethod
def c_func(cls):
print('类方法1')
静态方法:使用@staticmethod,参数随意,没有“self”和“cls”参数,但方法体中不能使用类或实例的任何属性和方法
静态方法可以由类去调用,也可以由对象去调用
class MyClass:
#静态方法
@staticmethod
def s_func():
print('静态方法1')
私有属性
单下划线开头:_attr
双下划线开头:__attr
声明为私有属性,那么说明该属性是类私有的,仅限于在类里面使用,不要再类外面去调用。
-
2、类的继承关系
实例属性是不能继承的
实例属性是实例对象所独有的(创建实例对象的时候才会进行赋值)
class Phone_V0:
attr = 999
def call(self):
print('打语音电话')
class Phone_V1(Phone_V0):# 继承V0
def music(self):
print('听音乐')
def send_msg(self):
print('发短信')
class Phone_V2(Phone_V1):# 继承V1
def game(self):
print('玩游戏')
def douyin(self):
print('刷抖音')
p = Phone_V2()
p.call() # 调用V0的call方法
print(p.attr) # 调用V0的类属性
-
3、重写父类重名的方法
重写父类的方法:父类又一个方法,继承之后又定义了一个和父类方法名相同的方法
在方法中调用父类被重写的方法:
方式一:父类名.方法名
方式二:super().方法名()(super(类,self).方法名())
class Phone_V0:
attr = 999
def call(self):
print('打语音电话')
class Phone_V1(Phone_V0):
def call(self):
print('打音频电话')
def music(self):
print('听音乐')
def send_msg(self):
print('发短信')
class Phone_V2(Phone_V1):
# 重写父类的方法:父类又一个方法,继承之后又定义了一个和父类方法名相同的方法
def call(self):
print('打视频电话')
print('1分钟后')
#在方法中调用父类被重写的方法
#方式一:
# Phone_V0.call(self)
#方式二:
super().call()
def game(self):
print('玩游戏')
def douyin(self):
print('刷抖音')
v2 = Phone_V2()
v2.call() # 若V1里面没有call方法,调用V0里面的方法
-
4、动态属性
属性动态设置(反射机制)
设置属性:setattr(对象,属性名,属性值)
获取属性:getatter(对象,属性名)
删除属性:delatter(对象,属性名)
class Cases:
def __init__(self,name):
self.name = name
case1 = Cases('xiaoming')
# 对象设置属性:对象.属性名 = 属性值
datas = {'case_id':'1','data':'999','url':'www.baidu.com'}
# 给对象动态设置属性:setattr(方法三个参数)---->(对象,属性名,属性值)
setattr(case1,'age','99') # 相当于 case1.age = 99
print(case1.age)
# 把datas数据设置为对象的属性
for k,v in datas.items():
print(k,v)
setattr(case1,k,v)
print(case1.url)
# 获取属性值
res = getattr(case1,'name')
print(res)
# 删除属性
delattr(case1,'name')