前言:本文主要介绍python面对对象中的类和继承,包括类方法、静态方法、只读属性、继承等。python
使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名通常约定为“cls",经过它来传递类的属性和方法编程
(不能传递实例属性和实例方法),跟实例方法的self用法类似。测试
实例对象和类对象均可以调用spa
在须要站在类的角度执行某个行为时,那么就能够定义为类方法code
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() # 经过类对象访问类方法
运行结果:orm
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
(了解便可,在自动化测试中暂时用不到)对象
使用装饰器@staticmethod装饰,参数随意,不须要“self“和“cls"参数,可是方法体中不能使用类或实例的任何属性和方法blog
实例对象和类对象均可以调用继承
用于存放纯逻辑代码,内部不须要引用类或实例的属性和方法游戏
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
(了解便可,在自动化测试中暂时用不到)
使用装饰器@property装饰,须要一个self参数,即实例对象自己,用于定义一个属性(通常指实例属性),只能读,不能写入
经过实例对象去调用
属性只能读,不能够写入或更改
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这个父类(基础类)。那么什么是继承?继承的做用是什么呢?
定义:面对对象编程中有一个很重要的思想叫继承,子类能够经过继承得到父类的属性和方法,被继承的类叫父类(基类),
继承的类叫子类
子类的实例对象能访问全部父类的实例方法,无论往上有几层父类均可以访问,但不能往下访问本身的子类
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
调用父类的属性也是如此,这里就再也不举例了。
子类不只仅能够调用父类的方法,也能够重写父类的方法再从新调用,简单来讲在子类中写一个与父类同名的方法,而且也沿用父类方法里的代码,
只是在父类方法基础上再增长一些代码,子类重写了父类的方法后,再调用父类方法的方式有两种:
方式二:
# -*- coding:utf8 -*- """ ================================= 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
重写父类方法后也能够再也不调用父类方法,至关于把重名的方法从新写一遍,若是以为理解不了,本身多敲几遍,触类旁通练习一下吧!
做者:miki_peng
出处:https://www.cnblogs.com/miki-peng