背景:因为python+selenium搭建框架封装函数的过程中,发现自己对这块模糊了,阻塞了,所以特开个python基础栏目,以做补充。
摘要:python 的 类和对象。
面向对象编程的三大特征:
封装:将数据和方法放在一个类中就构成了封装
继承:python中子类可以继承多个父类
多态:不同的子类重写了父类的方法,实现了多种形态。
1、创建和使用
首先,你问我对象是啥子?我说:一切皆可对象。
猴子是一个对象,静态属性:它自己天生就带的,2个耳朵,1个屁股。动态属性:奔跑、爬树、一言不合就开车~~
class Dog():
'''一次模拟小狗的简单尝试'''
# '属性'
def __init__(self,name,age):
'''初始化dog的属性'''
self.name = name
self.age = age
# '方法'
def sit(self):
'''模拟小狗蹲下'''
print(self.name.title() + "is now sitting.")
def roll_over(self):
'''模拟小狗打滚'''
print(self.name.title()+'rolled over!')
# (1)类化为对象,访问属性
a = Dog('habagou1',6).name
b = Dog('habagou2',6).age
print(a,b)
# (2)类化为对象,调用方法
a1 = Dog('habagou3',6).sit()
b1 = Dog('habagou3',6).roll_over()
print(a1)
实际项目中,我们是怎么用类的:代码
# 将鼠标的基础操作视为一个类
class Base():
def __init__(self, driver, log):
self.driver = driver
self.log = FrameLog().log()
# 查找界面上的元素
def findele(self, *args):
return self.driver.find_element(*args)
# 点击
def click(self, *args):
return self.findele(*args).click()
# 发送信息
# noinspection SpellCheckingInspection
def sendkey(self, args, value):
self.findele(*args).send_keys(value)
2、给属性指定默认值、修改属性值、递增属性值
class Dog():
'''一次模拟小狗的简单尝试'''
# '属性'
def __init__(self,name,age):
'''初始化dog的属性'''
self.name = name
self.age = age
self.a = 0
# '方法'
def sit(self):
'''模拟小狗蹲下'''
print(self.name.title() + "is now sitting.")
def roll_over(self):
'''模拟小狗打滚'''
print(self.name.title()+'rolled over!')
def man_bu(self):
'''小狗漫步'''
print('小狗向前走了' + str(self.a) + '步')
def update_man_bu(self,b):
self.a += b
# # (1)类化为对象,访问属性
# a = Dog('habagou1',6).name
# b = Dog('habagou2',6).age
# print(a,b)
# # (2)类化为对象,调用方法
# a1 = Dog('habagou3',6).sit()
# b1 = Dog('habagou3',6).roll_over()
# print(a1)
# 修改类的默认属性值,且属性值递增
a = Dog('habago4u',6)
print(a.man_bu())
a.update_man_bu(5)
a.update_man_bu(5)
a.update_man_bu(5)
print(a.man_bu())
3、类的继承:代码里的第二个类有3点。
class Dog():
'''一次模拟小狗的简单尝试'''
# '属性'
def __init__(self,name,age):
'''初始化dog的属性'''
self.name = name
self.age = age
self.a = 0
# '方法'
def sit(self):
'''模拟小狗蹲下'''
print(self.name.title() + "is now sitting.")
def roll_over(self):
'''模拟小狗打滚'''
print(self.name.title()+'rolled over!')
def man_bu(self):
'''小狗漫步'''
print('小狗向前走了' + str(self.a) + '步')
def update_man_bu(self,b):
self.a += b
class huangsegougou(Dog):
'''这是黄色狗狗'''
# (1)这两行代码中的,super函数让黄色狗狗继承了父类dog的所有属性
def __init__(self,name,age):
super(huangsegougou, self).__init__(name,age)
# (2)将下面的wangcai类的实例直接放在这,只要我调用黄色色狗狗这个类,我的旺财就会“吼一声”
self.wangcai = Wangcai()
# (3)通过覆盖方法名,直接重写了父类的方法。
def man_bu(self):
print('黄色狗狗走了' + str(self.a) + '步')
class Wangcai:
def __init__(self):
print('旺财吼了一声,声如雷!')
#以下是4月3号补充:
# 类的私有属性、继承、拓展、重写、超继承(重写后父类的方法不存早了,所以需要超继承)
class Test_a:
def __init__(self, a, b): # 私有属性
self.a = a
self.b = b
def add(self):
return self.a + self.b
def sub(self):
return self.a - self.b
class Test_b(Test_a): # 继承
def divide(self): # 拓展
return self.a/self.b
def add(self): # 重写了父类的add方法
print(super(Test_b,self).add()) # 超继承 = 子类重写的情况下调用父类的方法add
print(self.a + self.b + 10)
if __name__ == "__main__":
Test_b(5,6).add()
D:\interface_project\venv\Scripts\python.exe D:/interface_project/python_xx/test.py
11
21
4、导入类
导入类让我们更能专注于主程序的高级逻辑了,项目中就是主要关注业务逻辑的实现。
(1)项目中的base.py定义了很多基础的类,全部导入:from base import *
(2)一个类,可以继承多个类。,要继承的类逗号隔开就行了,类名后面的括号里头跟的是父类,可以跟多个,如果调用的父类的方法不一样,那就是调用特定的某个父类的方法,如果调用的父类方法在两个父类里头都有,遵循先来后到原则。
class Dituguanli(UnitBase,Base):
# 如何确保是Base类中的self.find_element()跟unittest中的是一类。
def test_dianjixinwen(self):
self.findele(By.XPATH,"//*[text()='新闻']")
print('跑通了')