当前位置: 首页 > news >正文

python_类and对象

背景:因为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('跑通了')

相关文章:

  • 记录我定位了2天的bug,坚持下去,问题终究会解决。
  • python_函数_参数(args、*args、**kwargs)
  • python与selenium_强制等待、隐性等待、显性等待
  • python_日志相关
  • jenkins总结1 - 安装、git、allure、email插件配置
  • pytest框架_简介、pytest.main()
  • pytest框架_@pytest.fixture()
  • pytest框架_@pytest.mark.usefixtures()
  • pytest框架_conftest.py详解
  • pytest框架_@pytest.mark.parametrize()
  • pytest框架_@pytest.yield_fixture()
  • pytest框架_@pytest.mark.xfail()
  • pytest框架_@pytest.mark.skipif()
  • pytest框架_pytest.ini
  • pytest框架_测试报告(allure-pytest)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Python学习之路13-记分
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • tab.js分享及浏览器兼容性问题汇总
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 构建工具 - 收藏集 - 掘金
  • 回顾2016
  • 计算机在识别图像时“看到”了什么?
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 巧用 TypeScript (一)
  • 数组大概知多少
  • 突破自己的技术思维
  • 详解移动APP与web APP的区别
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用jQuery怎么做到前后端分离
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #162 (Div. 2)
  • (2)STL算法之元素计数
  • (C#)一个最简单的链表类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (简单) HDU 2612 Find a way,BFS。
  • (生成器)yield与(迭代器)generator
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (循环依赖问题)学习spring的第九天
  • (一)Java算法:二分查找
  • (一)RocketMQ初步认识
  • (转)甲方乙方——赵民谈找工作
  • **PHP二维数组遍历时同时赋值