python入门基础(14)--类的属性、成员方法、静态方法以及继承、重载

方法,python,属性,成员 · 浏览次数 : 28

小编点评

**方法重载** 方法重载:在子类中定义一个和所继承的父类中,同名的方法。比如,上述代码中animal类中有一个move()方法,如果将子类Person中的def run(self) 修改为def move(self),即move()方法被 重载了当用子类Person创建对象(实例化)后,调用的是Person类中的move()。同样,如果在多重继承中,两个父类具有同名方法,为避免不要求的错误,在子类中对该方法进行重载。 **多重继承** 多重继承:一个类不仅可以继承一个类,还可以继承多个类,即多重继承。和上述所讲继承一样,只不过在括号中,用“,”分隔开。可以当作思考题,自动动手,比如利用上述的person类,Cat类,创建一个怪物类,然后实例化。 **示例** ```python class Animal: def eat(self): print("动物吃鱼") class Cat(Animal): def move(self): print("猫移动了10公里") # 创建猫对象 tom = Cat() # 调用猫的move()方法 tom.move(2, 4) ``` **输出** ``` 猫移动了10公里 ``` **注意** 方法重载当子类继承父类时,子类如果要想修改父类的行为,则应使用方法重载来实现,方法重载:在子类中定义一个和所继承的父类中,同名的方法。

正文

上一篇提到过类的属性,但没有详细介绍,本篇详细介绍一下类的属性

一 、类的属性

  方法是用来操作数据的,而属性则是建模必不的内容,而且操作的数据,大多数是属性,比如游戏中的某个boss类,它的生命值就是属性(不同级别的boss,有不同的生命值),被攻击方法(不同的攻击,伤害值不同),当boss被攻击时,通过被攻击方法来减少boss自身的生命值,从而改变boss类的生命值属性。  

   python中类的属性有两类:实例属性和类属性 面向对象编程最大好处就是通过继承来减少代码,同时可以定制新类。类的继承,创建的新类称为了类,被继承的类为父类。子类继承父类后,子类就具有父类的属性和方法,但不能继承父类的私有属性和私有方法(属性名或方法名以两个下画线开头的),子类可以通过重载来修改父类的方法,以实现与父类不同的行为表现或能力。

下面通过一个代码实例,进行介绍,代码如下:

class Demo_Property:              #定义类
    class_name = "Demo_Property"  #类属性

    def __init__ (self,x=0):  #实例属性
        self.x = x

    def class_info(self):   #输出信息方法
        print("类变量值:",Demo_Property.class_name)
        print("实例变量值:",self.x)
    
    def chng(self,x):    #修改实例属性的方法
        self.x=x  #注意实例属性的引用方式        
        
    def chng_cn(self,name):   #修改类属性的方法
        Demo_Property.class_name = name  #注意类属性引用方式
        
dpa = Demo_Property()   #创建一个对象dpa,也就是实例化类
dpb = Demo_Property()   #创建一个对象dpb,即实例化类

print('初始化两个实例')
dpa.class_info()
dpb.class_info()

print('修改实例变量')
print('修改dpa 实例变量\n')
dpa.chng(3)
dpa.class_info()
dpb.class_info()

print('修改dpb实例变量\n')
dpb.chng(10)
dpa.class_info()
dpb.class_info

print('修改类变量')
print('修改 dpa类变量\n')
dpa.chng_cn ('dpa')
dpa.class_info()
dpb.class_info()

print('修改dpb实例变量\n')
dpb.chng_cn ('dpb')
dpa.class_info()
dpb.class_info()

代码说明:第一行定义Demo_property类,第二行class_name = "Demo_Property"  #定义了类的属性class_name,接下来的两行,定义了实例属性x,

后面三个def 分别定义了一个输入信息的方法class_info,一个修改实例属性的方法chng,一个修改类属性的方法chng_cn。再创建了两个实例dpa和dpb。

dpa.class_info()和dpb.class_info()分别调用class_info()方法分别打印类变量值和实例变量值。后面的几行,分别通过修改变量,来实现实例变量、类变量的变化。运行结果如下:

二、类成员方法与静态方法

和属性一样,类的方法也有不同类型,主要有实例方法、类方法、静态方法。上述所有类中的方法都是实例方法,隐含调用参数是类的实例,类方法隐含调用的是类,静态方法没有隐含参数。

类方法和静态方法的定义方式与实例方法不同,调用方式也不相同。

静态方法定义的时候用装饰器@staticmethod进行修饰,没有默认参数

类方法定义时应用装饰器@classmethod进行修饰,必须有默认参数“cls”,两者调用方式可以直接由类名进行,既可用该类的任一个实例进行调用 ,也可以在

实例化前调用。如下例子:

class DemoMthd:
    @staticmethod   #静态方法装饰器
    def static_mthd():   #定义一个静态类
        print("调用了静态方法!")
    @classmethod    #类方法装饰器
    def class_mthd(cls):  #类方法定义,带默认参数cls
        print("调用了类方法!")
        
DemoMthd.static_mthd()   #未实例化类,通过类名调用静态方法
DemoMthd.class_mthd()    #未实例化类,通过类名调用类方法

dm = DemoMthd ()   #创建对象,实例化
dm.static_mthd()   #通过实例调用静态方法 
dm.class_mthd()    #通过实例调用类方法

注意:仔细分析上面代码中的注释。运行结果如下:

三、类的继承

       通过上述例子,可以看出,我们在创建dpa和dpb时(其他例子中的多个对象),只通过实例化就创建了具体相同结构的对象,这就是面向对象编程的好处:减少代码量。

但如果dpa,dpb大部分结构相同,但又有所不同,比如游戏中的不同级别的boss,小boss,只有砍的攻击方法,而大boss,除了砍,还有喷火、扫腿……等不同的攻击方法(如上一篇中的,走、唱、跑方法一样),该如何处理?这就需要用到类的继承。类的继承,不仅可以减少代码量,同时还可以定制新类。

类的继承,创建的新类称为子类,被继承的类为父类。子类继承父类后,子类就具有父类的属性和方法,但不能继承父类的私有属性和私有方法(属性名或方法名以两个下画线开头的),子类可以通过重载(后面会演示)来修改父类的方法,以实现与父类不同的行为表现或能力。

那我们可以思考一下,将上一篇中的cat进行更加抽象成一个新类animal,然后cat的继承animal的属性,于是得到以下代码:

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 16 19:59:24 2023

@author: Administrator
"""

def coord_chng(x,y):        #定义一个全局函数,模拟坐标值变换
    return (abs(x),abs(y))  #将x,y 值求绝对值后返回

class Animal:
    def __init__ (self,lifevalue): 
        self.lifevalue=lifevalue
        
    def info(self):      #定义一个方法
         print("当前位置:(%d,%d)"% (self.x,self.y))   
    def crawl(self,x,y):
         self.x=x
         self.y=y
         print("爬行……")
         self.info()    
         
    def move(self,x,y):        #定义一个方法move()
            x,y = coord_chng(x,y)  #调用全局函数,坐标变换
            self.edit_point(x,y)   #调用类中的方法edit_point()
            self.disp_point()      #调用类中的方法disp_point()
        
    def edit_point(self,x,y):  #定义一个方法
            self.x += x
            self.y += y

    def disp_point(self):      #定义一个方法
            print("当前位置:(%d,%d)"% (self.x,self.y))     
    
class Cat(Animal):          #定义一个类Cat类,继承类Animal
    def __init__ (self,x=0,y=0,color="white"):  #定义一个构造方法
        self.x=x
        self.y=y
        self.color=color      #新增加一个颜色
        self.disp_point()      #构造函数中调用类中的方法disp_point()
    
    def run(self,x,y):        #定义一个方法run()
            x,y = coord_chng(x,y)  #调用全局函数,坐标变换
            self.edit_point(x,y)   #调用类中的方法edit_point()
            self.disp_point()      #调用类中的方法disp_point()
     

cat_a= Cat()      #实例化Cat()类
cat_a.move(2,4)   #调用cat_a实例的方法move()
cat_a.move(-9,6)  #调用cat_a实例的方法move()
cat_a.move(12,-16)#调用cat_a实例的方法move()
cat_a.run(12,-16) #调用cat_a实例的方法run()

注意红色注释部分,move()这个方法是Cat类没有的,但在Animal中有,Cat类通过继承Animal类,获得了Animal中move方法。

同样,也可以将上篇中的Person类继承Animal类的功能,并进行少量修改,全部代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 17 19:59:24 2023

@author: Administrator
"""

def coord_chng(x,y):        #定义一个全局函数,模拟坐标值变换
    return (abs(x),abs(y))  #将x,y 值求绝对值后返回

class Animal:
    def __init__ (self,lifevalue): 
        self.lifevalue=lifevalue
        
    def info(self):      #定义一个方法
         print("当前位置:(%d,%d)"% (self.x,self.y))   
    def crawl(self,x,y):
         self.x=x
         self.y=y
         print("爬行……")
         self.info()  
def move(self,x,y): #定义一个方法move() x,y = coord_chng(x,y) #调用全局函数,坐标变换 self.edit_point(x,y) #调用类中的方法edit_point() self.disp_point() #调用类中的方法disp_point() def edit_point(self,x,y): #定义一个方法 self.x += x self.y += y def disp_point(self): #定义一个方法 print("当前位置:(%d,%d)"% (self.x,self.y)) class Cat(Animal): #定义一个类Cat类,继承类Animal def __init__ (self,x=0,y=0,color="white"): #定义一个构造方法 self.x=x self.y=y self.color=color #新增加一个颜色 self.disp_point() #构造函数中调用类中的方法disp_point() class Person(Animal): #定义一个类Person类,继承类Animal def __init__(self,new_name,x,y,new_age,new_hight,new_weight,edu_certification,new_job): #self.name = "Tom" self.x=x self.y=y self.name=new_name self.age=new_age self.hight=new_hight self.weight=new_weight self.edu_certif=edu_certification self.job=new_job def eat(self): # 哪一个对象调用的方法,self就是哪一个对象的引用 print("%s 爱吃鱼" % self.name) def drink(self): print("%s 要喝水" % self.name) def walk(self): print("%s今天步行了10公里"%self.name) def run(self): # 必须返回一个字符串 return "%s跑了10公里,用时56分钟。" % self.name def sing(self): # 必须返回一个字符串 return "%s唱了一首《我的中国心》" % self.name def working(self): # 必须返回一个字符串 return "%s工作了很久!" % self.name tom=Person("Tom",10,20,24,175,70,"bachelor","writer") #lucy=Person("Lucy") #lily=Person("Lily") print("%s的身高是%s cm\n" %(tom.name,tom.hight)) print("%s的体重是%sKG\n" %(tom.name,tom.weight)) print(tom.sing()) print(tom.run()) tom.move(2,4) tom.move(10,-12) print("------------------显示分隔线--------------------\n") cat_a= Cat() #实例化Cat()类 cat_a.move(2,4) #调用cat_a实例的方法move() cat_a.move(12,-16)#调用cat_a实例的方法move()

代码中红色部分为修改。可以看出,tom继承Animal类后,也继承了move()方法。运行结果:

 

四、类的多重继承

python编程中,一个类不仅可以继承一个类,还可以继承多个类,即多重继承。和上述所讲继承一样,只不过在括号中,用“,”分隔开。可以当作思考题,自动动手,比如利用上述的person类,Cat类,创建一个怪物类,然后实例化。

五、方法的重载

当子类继承父类时,子类如果要想修改父类的行为,则应使用方法重载来实现,
方法重载:在子类中定义一个和所继承的父类中,同名的方法。

比如,上述代码中animal类中有一个move()方法,如果将子类Person中的def run(self) 修改为def move(self),即move()方法被 重载了

当用子类Person创建对象(实例化)后,调用的是Person类中的move()。

同样,如果在多重继承中,两个父类具有同名方法,为避免不要求的错误,在子类中对该方法进行重载。

 

 

与python入门基础(14)--类的属性、成员方法、静态方法以及继承、重载相似的内容:

python入门基础(14)--类的属性、成员方法、静态方法以及继承、重载

上一篇提到过类的属性,但没有详细介绍,本篇详细介绍一下类的属性 一 、类的属性 方法是用来操作数据的,而属性则是建模必不的内容,而且操作的数据,大多数是属性,比如游戏中的某个boss类,它的生命值就是属性(不同级别的boss,有不同的生命值),被攻击方法(不同的攻击,伤害值不同),当boss被攻击时

python入门基础(15)--模块和python中数学、日期、时间类模块。

接上篇,当我们创建了很多类,比如 图书馆里的藏书,分社会科学类,艺术类、生活类、农业类、工业类等,而工业类又分为轻工业、重工业、信息工业,然后再细分。当分的越来越细时,程序就会越来越大。如何管理,便成了程序开发过程中一个重要的环节。于是可以按照图书馆分类管理的思想,对程序代码进行管理。 将一个应用程

python入门基础(13)--类、对象、全局函数,类内部调用

面向过程的编程语言,如C语言,所使用的数据和函数之间是没有任何直接联系的,它们之间是通过函数调用提供参数的形式将数据传入函数进行处理。 但可能因为错误的传递参数、错误地修改了数据而导致程序出错,甚至是崩溃。当需要修改或维护程序时要从程序提供的一堆数据中去寻找和修改它,要扩展函数的功能,只能重新建立一

全渠道定价、库存决策,混合整数规划建模求解,MNL选择模型,内附代码!

敲敲敲详细的高分牛刊论文阅读笔记,还有Python的PyLogit包详解!全渠道、运筹规划领域入门/基础模型,内附论文的主要内容翻译解读、模型讲解和代码实现!

通过模仿学会Python爬虫(一):零基础上手

好家伙,爬虫来了 爬虫,这玩意,不会怎么办, 诶,先抄一份作业回来 1.别人的爬虫 Python爬虫史上超详细讲解(零基础入门,老年人都看的懂)_ChenBinBini的博客-CSDN博客 # -*- codeing = utf-8 -*- from bs4 import BeautifulSoup

聊聊神经网络的基础知识

来自《深度学习入门:基于Python的理论与实现》 张量 Numpy、TensorFlow、Pytorch等框架主要是为了计算张量或是基于张量计算。 标量:0阶张量;12,4,3, 向量:一阶张量;[12,4,3] 矩阵:二阶张量;[ [12,4,3], [11,2,3] ] 多阶张量:多维数组;

跟我学Python图像处理丨带你入门OpenGL

摘要:介绍Python和OpenGL的入门知识,包括安装、语法、基本图形绘制等。 本文分享自华为云社区《[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)》,作者:eastmount。 一.OpenGL入门知识 1.什么是OpenGL OpenGL(Open Graphics L

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

本文主要介绍了Python中创建自定义类时鸭子类型的基本定义、特点和应用场景,同时列举了“file-like object“的例子对鸭子类型进行了说明。

算法金 | 10 大必知的自动化机器学习库(Python)

大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 一、入门级自动化机器学习库 1.1 Auto-Sklearn 简介: Auto-Sklearn 是一个自动机器学习库,基于 Python 的 scikit-learn 接口。它主要用于自

gRPC入门学习之旅(十)

gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发, gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。本系统文章详细描述了如何创建一...