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().方法名()
# -*- coding:utf8 -*-
"""
=================================
    Time    : 2019/10/8 21:04
    Author  : miki_peng
    Email   : [email protected]
    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

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,请大家尊重原创,如要转载,请在文章页面明显位置注明出处,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/miki-peng/p/12241177.html

时间: 2024-10-03 03:31:08

16、python面对对象之类和继承的相关文章

Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)

一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A: def __init__(self): print('A') class B: def __init__(self): print('B') obj = A() #虽然只是创建了obj对象,但是执行了__init__方法,输出了A Python中派生类可以继承父类的构造方法 1.基于super() 遇到super()就表示去执行父类的xxx属性 class A: def __init__(

Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2.异常种类 3.异常其他结构 4.主动触发异常 5.自定义异常 6.断言 四.反射 五. 单例模式 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass ob

Python - 面对对象(基础)

目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程(Object Oriented Programming,OOP,面向对象程序设计) 最易被初学者接受,其往往用一长段代码来实现指定功能,开发

15、python面对对象之类和对象

前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真实存在的,描绘了该类事物共有的特征和行为 例如:猫类.狗类.鸟类.车类等 实例对象:某类事物的具体个体,是该类事物的具体表现,它是真实存在的 例如:“张三”是具体的某个“人“,”二哈“是具体的某个”狗“ 二.类的定义 关键字:class 定义类的方法: 方式一:class 类名: 方式二:class

javascript面对对象编程 之继承

上一篇博客中为大家介绍了javascript面向对象编程原则的封装,今天为大家介绍继承,在javascript中没有类的概念,所有不能像c#,java语言那样,直接的用类去继承类.比如现在有比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数. function Cat(name,color){ this.name = name; this.co

python面对对象笔记整理

首先声明本文纯属笔记 1 面对对象三大特性: 1.1 封装:将字段封装在类中,通过类中self调用或者通过对象来调用. 1.2 继承:一般的继承不再叙述,多继承参考另一篇文章 python多继承 1.3 多态:因为python的函数可以传入多种类型的参数,所以不存在多态.python这种形式属于鸭子类型,也就是长得像鸭子的类型都可以. 2

python面对对象

中间隔有python模块没有进行更新,是因为觉得模块的操作应用更应该记牢,再次先不更新 1,面对对象的作用: 能简化思路和代码 2,面对对象的思路: 不着急直接去计算/操作代码获取结果 从一个大的问题中,要到要描述的角色 将角色的属性和行为抽象出来 形成一个模子 后期用到角色的时候,都围绕这个模子来操作.3,类 :一类抽象的事物,是描述了一类事物有哪些属性或者行为,但是不具体.4,实例:就是一个依托于类的规范存在的,被赋予了具体属性值得实际存在的物体5,对象 :就是实例--给类中约束的属性赋了具

python面对对象编程-------5:获取属性

一:最基本的属性操作 1 class Generic: 2 pass 3 4 g= Generic() 5 6 >>> g.attribute= "value" #创建属性并赋值 7 >>> g.attribute 8 'value' 9 >>> g.unset 10 Traceback (most recent call last): 11 File "<stdin>", line 1, in &l

Python 面对对象编程

面向对象编程: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对