面向对象编程的三大特征:封装,集成,多态
class A:
a_attr1 = 100
def func_a(self):
print('------func_a--------')
class B:
b_attr1 = 999
def func_b(self):
print('------func_b--------')
class Demo(A, B):
pass
d = Demo()
# 调用父类A的属性和方法
print(d.a_attr1)
d.func_a()
# 调用父类B的属性和方法
print(d.b_attr1)
d.func_b()
# 打印结果
100
------func_a--------
999
------func_b--------
答:就近原则,他先找括号里面左边这个类,左边这个类找到了就不会再去找右边这个类,左边的类如果找不到就去右边这个类找。
注意:如果demo这个类自己有这个方法,就不会再去父类里面找,如果demo这个类没有,才会去父类里面去找。
class A:
a_attr1 = 100
attr = 10
def func_a(self):
print('----funca——————')
def work(self):
print('----funca——work————')
class B:
b_attr1 = 999
attr = 99999
def func_b(self):
print('----funcb——————')
def work(self):
print('----funcb——work————')
class Demo(A, B):
pass
d = Demo()
# 调用两个父类中同名的方法和属性
print(d.attr)
# 打印结果
10
方法名上面加了@property之后,不再是方法名,而是属性名称
class B:
b_attr1 = 999
attr = 99999
def func_b(self):
print('----funcb——————')
def work(self):
print('----funcb——work————')
class Demo(A, B):
def work(self):
print('demo---work')
@property # 定义只读属性
def battr(self):
return B.attr
d = Demo()
# 只读属性
print(d.battr)
# 打印结果
99999
"""
定义一个api测试的用例类
1、用例数据处理
2、接口请求
3、响应数据提取
3、断言
"""
class HandleData:
pass
class RequestApi:
pass
class BaseTest(HandleData, RequestApi):
pass
实现多态的步骤:
还是不懂多态是啥意思吗?没关系,我们上一段代码就明白了。
一个父类,他具有多个子类,不同的子类在调用相同的方法,执行的时候产生不同的形态,这个叫多态。
class Animal(object):
"""动物类"""
def func(self):
print('动物发出了声音')
class Cat(Animal):
"""猫类"""
def func(self):
print('喵 喵 喵')
class Dog(Animal):
"""狗类"""
def func(self):
print('汪 汪 汪 ')
class Hero:
def func(self):
print('这个是英雄类的方法,不是动物类的对象')
def work01(musen: Animal):
musen.func()
work01(Hero())
多态的意义:
“开放封闭”原则:
注意点:Python中函数的参数是没有类型限制的,所以多态在python中的体现并不是很严谨。多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
class Animal(object):
"""动物类"""
def func(self):
print('动物发出了声音')
class Cat(Animal):
"""猫类"""
def func(self):
print('喵 喵 喵')
class Dog(Animal):
"""狗类"""
def func(self):
print('汪 汪 汪 ')
class Hero:
def func(self):
print('这个是英雄类的方法,不是动物类的对象')
def work01(musen: Animal):
musen.func()
work01(Hero())
"""
"""
鸭子类型概念:它并不要求严格的继承体系,关注的不是对象的类型,而是它是否具有要调用的方法(行为)。
鸭子类型在python中的案例:
内置函数iter:参数可以是实现迭代协议(`__iter__`方法)的任何类型的对象
"""
li = [11, 22, 33, 44]
s = '1212124'
class MyTest:
def __iter__(self):
return (i for i in range(10))
def __len__(self):
return 10
li1 = iter(li) # 内置函数iter将可迭代对象转换为迭代器,,本质上是调用对象的__iter__
s1 = iter(s) # 内置函数iter将可迭代对象转换为迭代器,,本质上是调用对象的__iter__
m = MyTest()
m1 = iter(m)
# 内置函数len获取数据的长度,本质上是调用对象的__len__
print(len(m))