16、python面对对象之类和继承
前言:本文主要介绍python面对对象中的类和继承,包括类方法、静态方法、只读属性、继承等。
一、类方法
1.类方法定义
使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名一般约定为“cls",通过它来传递类的属性和方法(不能传递实例属性和实例方法),跟实例方法的self用法相似。
2.类方法的调用
实例对象和类对象都可以调用
3.应用场景
在需要站在类的角度执行某个行为时,那么就可以定义为类方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def student_info(self):
"""实例方法"""
print("-----student_info-----")
print('name:{}'.format(self.name))
print('age:{}'.format(self.age))
@classmethod # 带有@classmethod标志的就是类方法,@xxx 就是装饰器
def class_info(cls): # cls与self的用法一致,self代表的是实例对象本身,cls代表的是类本身
"""类方法""" # 应用场景:需要站在类的角度执行某个行为时,就定义为类方法
print("-----class_info-----")
print('在校学生')
print("cls:", cls)
case = Student('张三', 22)
case.student_info()
case.class_info() # 通过实例对象访问类方法
Student.class_info() # 通过类对象访问类方法
运行结果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
-----student_info-----
name:张三
age:22
-----class_info-----
在校学生
cls: <class '__main__.Student'>
-----class_info-----
在校学生
cls: <class '__main__.Student'> Process finished with exit code 0
二、静态方法
(了解即可,在自动化测试中暂时用不到)
1.静态方法定义
使用装饰器@staticmethod装饰,参数随意,不需要“self“和“cls"参数,但是方法体中不能使用类或实例的任何属性和方法
2.静态方法的调用
实例对象和类对象都可以调用
3.应用场景
用于存放纯逻辑代码,内部不需要引用类或实例的属性和方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def student_info(self):
"""实例方法"""
print("-----student_info-----")
print('name:{}'.format(self.name))
print('age:{}'.format(self.age))
@staticmethod # 静态方法不会牵涉到类和实例,里面只存放逻辑代码
def static_move(): # 类和实例都可以调用静态方法
"""静态方法"""
print("-----static_info-----")
print('清华大学的学生')
case = Student('张三', 22)
case.student_info()
case.static_move() # 通过实例对象访问静态方法
Student.static_move() # 通过类对象访问静态方法
运行结果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
-----student_info-----
name:张三
age:22
-----static_info-----
清华大学的学生
-----static_info-----
清华大学的学生 Process finished with exit code 0
三、只读属性
(了解即可,在自动化测试中暂时用不到)
1.只读属性定义
使用装饰器@property装饰,需要一个self参数,即实例对象本身,用于定义一个属性(一般指实例属性),只能读,不能写入
2.只读属性的调用
通过实例对象去调用
3.应用场景
属性只能读,不可以写入或更改
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def student_info(self):
"""实例方法"""
print("-----student_info-----")
print('name:{}'.format(self.name))
print('age:{}'.format(self.age))
@property
def property(self): # 定义一个只能用,不能改的属性,了解即可
"""只读属性"""
print("-----property_info-----")
return 18
case = Student('张三', 22)
case.student_info()
print(case.property) # 通过实例对象访问只读属性
运行结果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
-----student_info-----
name:张三
age:22
-----property_info-----
18 Process finished with exit code 0
四、继承
在上一章的随笔中也提到过,在python3中,所有的类都默认继承自object这个父类(基础类)。那么什么是继承?继承的作用是什么呢?
1.继承的定义及作用
- 定义:面对对象编程中有一个很重要的思想叫继承,子类可以通过继承获得父类的属性和方法,被继承的类叫父类(基类),继承的类叫子类
- 作用:子类可以通过继承获得父类的属性和方法,从而提高开发的效率和代码的复用
2.调用父类里的方法
子类的实例对象能访问所有父类的实例方法,不管往上有几层父类都可以访问,但不能往下访问自己的子类
class BasePhone(object):
"""定义一个手机基础类"""
def __init__(self, brand, model, price):
self.brand = brand
self.model = model
self.price = price def phone_func(self):
"""手机功能"""
print("这款手机是触屏手机")
print("这款手机是智能手机")
print("这款手机有红外线功能")
print("这款手机有nfc功能") class HonorPhone(BasePhone):
"""继承手机基础类,这是荣耀系列手机,基础功能都有""" def phone_info(self):
print("您的手机品牌是{},型号{},价格{}".format(self.brand,self.model,self.price)) def honor_func(self):
"""荣耀功能"""
print("这款手机支持HiFi")
print("这款手机可以玩mobile游戏")
print("这款手机支持应用分屏") class HonorPorPhone(HonorPhone):
"""继承手机基础类,这是荣耀pro系列手机,基础功能和荣耀功能都有""" def new_func(self):
"""新功能"""
print("这款手机支持30倍变焦") # 实例化对象,继承后有最上层父类的初始化方法,需要传三个参数
phone1 = HonorPorPhone('荣耀手机', 'Honor20pro', '¥3599')
phone1.phone_info()
phone1.phone_func() # 调用最上层父类的方法(子类创建出来的对象能访问所有父类的实例方法)
phone1.honor_func() # 调用父类的方法
phone1.new_func() # 调用自己的方法 phone2 = HonorPhone('荣耀手机', 'Honor20', '¥2999')
# 作为HonorPorPhone类的父类,创建出来的对象不能访问子类(即HonorPorPhone类)的实例方法,不能往下访问
phone2.new_func() # 因此这里运行会报错
运行结果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
您的手机品牌是荣耀手机,型号Honor20pro,价格¥3599
这款手机是触屏手机
这款手机是智能手机
这款手机有红外线功能
这款手机有nfc功能
这款手机支持HiFi
这款手机可以玩mobile游戏
这款手机支持应用分屏
这款手机支持30倍变焦
Traceback (most recent call last):
File "D:/learn/python18_http_request/exercise/test.py", line 62, in <module>
phone2.new_func()
AttributeError: 'HonorPhone' object has no attribute 'new_func' Process finished with exit code 1
调用父类的属性也是如此,这里就不再举例了。
3.子类中调用重名的父类方法
子类不仅仅可以调用父类的方法,也可以重写父类的方法再重新调用,简单来说在子类中写一个与父类同名的方法,并且也沿用父类方法里的代码,只是在父类方法基础上再增加一些代码,子类重写了父类的方法后,再调用父类方法的方式有两种:
- 方式一:父类名.方法名(self)
- 方式二:super().方法名()
"""
=================================
Time : 2019/10/8 21:04
Author : miki_peng
Email : 307325534@qq.com
File : day12_class_object.py
==================================
"""
# 继承:在python3的继承中,所有的类都默认继承自object这个父类(基础类)
# 两种写法都默认继承object类
# class Phone:
# pass
#
# class BasePhone(object):
# pass class BasePhone(object):
"""定义一个手机基础类"""
def __init__(self, brand, model, price):
self.brand = brand
self.model = model
self.price = price def phone_func(self):
"""手机功能"""
print("这款手机是触屏手机")
print("这款手机是智能手机")
print("这款手机有红外线功能")
print("这款手机有nfc功能") class HonorPhone(BasePhone):
"""继承手机基础类,这是荣耀系列手机,基础功能都有""" def phone_info(self):
print("您的手机品牌是{},型号{},价格{}".format(self.brand,self.model,self.price)) def phone_func(self):
"""重写父类的手机功能方法,在这基础上增加一个功能"""
print("这款手机有双摄像头")
# BasePhone.phone_func(self) # 重写父类同名方法后,再调用父类的方法 第一种方式
super().phone_func() # 重写父类同名方法后,再调用父类的方法 第二种方式(常用) def honor_func(self):
"""荣耀功能"""
print("这款手机支持HiFi")
print("这款手机可以玩mobile游戏")
print("这款手机支持应用分屏") class BetaPhone(BasePhone): # 这个类没有重写父类的手机功能方法
"""继承手机基础类,这是Beta系列手机,有基础功能""" def phone_info(self):
print("您的手机品牌是{},型号{},价格{}".format(self.brand,self.model,self.price)) def new_func(self):
"""新功能"""
print("这款手机支持30倍变焦") # 实例化对象,继承后有最上层父类的初始化方法,需要传三个参数
phone1 = HonorPhone('荣耀手机', 'Honor20', '¥2999')
phone1.phone_info()
phone1.phone_func() # 调用父类的方法
phone1.honor_func() # 调用自己的方法 print("-------------分割线------------")
phone2 = BetaPhone('Beta手机', 'Beta8', '¥3299')
phone2.phone_info()
phone2.phone_func()
phone2.new_func()
运行结果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
您的手机品牌是荣耀手机,型号Honor20,价格¥2999
这款手机有双摄像头
这款手机是触屏手机
这款手机是智能手机
这款手机有红外线功能
这款手机有nfc功能
这款手机支持HiFi
这款手机可以玩mobile游戏
这款手机支持应用分屏
-------------分割线------------
您的手机品牌是Beta手机,型号Beta8,价格¥3299
这款手机是触屏手机
这款手机是智能手机
这款手机有红外线功能
这款手机有nfc功能
这款手机支持30倍变焦 Process finished with exit code 0
重写父类方法后也可以不再调用父类方法,相当于把重名的方法重新写一遍,如果觉得理解不了,自己多敲几遍,举一反三练习一下吧!
16、python面对对象之类和继承的更多相关文章
- Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)
一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A: def __init__(self): print('A') class B: def __ ...
- Python - 面对对象(基础)
目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...
- Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)
目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...
- 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)
小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...
- 15、python面对对象之类和对象
前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真 ...
- Python - 面对对象(进阶)
目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...
- 小学生绞尽脑汁也学不会的python(面对对象-----成员)
小学生绞尽脑汁也学不会的python(面对对象-----成员) 成员 class Person: def __init__(self, name, num, gender, birthday): # ...
- python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法
一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...
- python面对对象编程----2:__init__
面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...
随机推荐
- Linux 内核 动态设备
术语"热插拔"最普遍使用的意义产生于当讨论这样的事实时, 几乎所有的计算机系统现在 能够处理当系统有电时设备的出现或消失. 这非常不同于只是几年前的计算机系统, 那时 程序员知道他 ...
- PowerShell 使用 WMI 获取信息
在 PowerShell 可以很容易使用 WMI 拿到系统的信息,如果有关注我的网站,就会发现我写了很多通过 WMI 拿到系统的显卡,系统安装的软件等方法,本文告诉大家如果通过 PowerShell ...
- Vue____实现本地代码推送到云端仓库的相关操作
项目初始化搭建完毕,每进行一个功能模块开发的必备操作,目的是方便协同开发以及备份代码 一.每开发一个新功能,都应该创建一个新分枝,待该功能模块开发完成以后,再合并到主分支master中,具体步骤如下: ...
- Centos 7.5安装 Redis 5.0.0
1 我的环境 1.1 linux(腾讯云) CentOS Linux release 7.5.1804 (Core) 1.2 Redis Redis 5.0.0 2 下载 官网 官网下载地址 3 ...
- 线程的通信与协作:sleep、wait、notify、yield、join关系与区别
一.sleep.join.yield.wait.notify.notifyAll 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也 ...
- 记一次线上 OOM 和性能优化
大家好,我是鸭血粉丝(大家会亲切的喊我 「阿粉」),是一位喜欢吃鸭血粉丝的程序员,回想起之前线上出现 OOM 的场景,毕竟当时是第一次遇到这么 紧脏 的大事,要好好记录下来. 1 事情回顾 在某次周五 ...
- springBoot 集成redis客户端傻瓜式流程
Redis目前作为很多项目的主流缓存方案,学习完redis的基本命令和特性后.我们要集成进我们的springboot项目中 不废话上代码 在application.yml中加入 spring: red ...
- Linux中 ps命令的参数讲解
Linux命令ps: (Process Status的缩写)该命令常常用来用来列出系统中当前运行的进程.ps是显示瞬间进程的状态,并不动态连续:如果想对进程进行实时监控应该用top命令 -a 显示所有 ...
- jetbrains全家桶 你懂得
这个是松哥说的引用一下: 昨天一直在忙,中午抽空瞅了一眼技术群,天呐,竟然都在切磋 IDEA 激活码的事情,瞬间明白可能 jetbrains 又在搞事情了. 我大概了解了下,这次出事的主要是 2019 ...
- Linux学习之路--常用命令讲解
Linux常用命令讲解 1.命令格式:命令 [-选项] [参数] 超级用户的提示符是# 一般用户的提示符是$ 如:ls -la /usr说明: 大部分命令遵从该格式多个选项时,可以一起写 eg:ls ...