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

一 、类的属性

  方法是用来操作数据的,而属性则是建模必不的内容,而且操作的数据,大多数是属性,比如游戏中的某个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)--类的属性、成员方法、静态方法以及继承、重载的更多相关文章

  1. Python 入门基础14 --time、os、random、json、pickle 常用模块1

    今日内容: 一.常用模块 2019.04.10 更新 1.time:时间 2.calendar:日历 3.datetime:可以运算的时间 4.sys:系统 5.os:操作系统 6.os.path:系 ...

  2. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  3. Python 入门基础6 --字符编码、文件操作1

    今日内容: 1.字符编码 2.字符与字节 3.文件操作 一.字符编码 了解: cpu:将数据渲染给用户 内存:临时存放数据,断电消失 硬盘:永久存放数据,断电后不消失 1.1 什么是编码? 人类能够识 ...

  4. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  5. Python入门基础学习 一

    Python入门基础学习 一 Python下载及安装 下载地址:https://www.python.org/,选择最新的版本下载 稍等一会,安装完成. 简单语句 从idle启动Python:IDLE ...

  6. python入门基础

    Python 入门 变量 什么是变量?变量就是变化的量,核心是"变"和"量"两个字,变就是变化,量就是衡量状态. 为什么需要变量?程序执行的本质就是一系列状态的 ...

  7. Python入门 ---基础知识

    Python入门不知道这些你还是承早放弃吧!真的 Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言 ...

  8. Java入门基础(类)

    类 在Java中表示自定义的数据类型,一个class可以是若干基本类型的组合. public class Student { public String id;//学号 public String n ...

  9. Python面向对象基础:设置对象属性

    用类存储数据 类实际上就是一个数据结构,对于python而言,它是一个类似于字典的结构.当根据类创建了对象之后,这个对象就有了一个数据结构,包含一些赋值了的属性.在这一点上,它和其它语言的struct ...

  10. guxh的python笔记六:类的属性

    1,私有属性 class Foo: def __init__(self, x): self.x = x 类的属性在实例化之后是可以更改的: f = Foo(1) print(f.x) # 1 f.x ...

随机推荐

  1. shader编程经典:分形--科赫曲线

    序言 科赫(雪花)曲线是一个经典分形图案,来一起领略下分形之美.本篇内容用到一些基础的内容,例如UV的理解和画线技巧,有需要的话可以参考合集的画圆和画线两篇文章. 示例 shadertoy 代码: # ...

  2. 读文献先读图——主成分分析 PCA 图

    上周五彩斑斓的气泡图 有让你眼花缭乱吗? 本周,化繁为简的PCA图 你值得拥有!  数据分析| 科研制图﹒PCA 图 关键词:主成分分析.降维 1665 年的鼠疫 牛顿停课在家提出了万有引力 ;183 ...

  3. tryhackme-Agent Sudo

    描述:您在深海下发现了一个秘密服务器.你的任务是侵入服务器内部并揭露真相. 枚举 nmap -sV -T4 -v 10.10.123.164 NSE: Script scanning 10.10.12 ...

  4. 10.5. 版本控制(如Git)

    版本控制系统(Version Control System,VCS)是软件开发过程中用于管理源代码的工具.它可以帮助你跟踪代码的变更历史,方便回滚到之前的版本,以及协同多人共同开发.Git是当前最流行 ...

  5. [汽车]车架号(VIN)的设计与规范

    1 车架号概述 VIN是英文Vehicle Identification Number(车辆识别代码)的缩写,也就是我们平时所说的车架号.大架号. 总共由17位字符组成,是汽车唯一的身份识别信息,好比 ...

  6. Kafka关键原理

    日志分段切分条件 日志分段文件切分包含以下4个条件,满足其一即可: 当前日志分段文件的大小超过了broker端参数 log.segment.bytes 配置的值.log.segment.bytes参数 ...

  7. 【python基础】类-继承

    编写类时,并非总是要从空白开始.如果要编写的类时另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法 原有的类称为父类,而新类被称为子类.子类继承了其父类的所 ...

  8. 2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案。

    2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案. 答案2023-07-03: 数据一致性 当使用缓存时,无论是在本地内存中缓存还是使用 Redis 等外部缓存系统,会引入数据同步 ...

  9. 最简单的人脸检测(免费调用百度AI开放平台接口)

    远程调用百度AI开放平台的web服务,快速完成人脸识别 欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos ...

  10. HCL 实验7:OSPF

    拓扑图 R1配置 [R1]int g0/1 [R1-GigabitEthernet0/1]ip add 192.168.4.1 24 [R1-GigabitEthernet0/1]undo shutd ...