python面向对象类属性_python面向对象(五、类属性、类方法、)

本文详细介绍了Python中的类和对象,包括类的创建、实例化、实例属性和类属性的区别,以及类方法和静态方法的使用。通过实例展示了如何在类中定义和访问这些属性和方法,并探讨了类与类之间的关系,如依赖、关联和继承。同时,提到了`@property`和`@setter`装饰器在属性管理中的作用。
摘要由CSDN通过智能技术生成

6.类属性和类方法

6.1 类的结构

6.1.1 实例

1)创建对象步骤:

(1)使用面相对象开发,第 1 步是设计类

(2)使用类名()创建对象,创建对象的动作有两步:

在内存中为对象分配空间

调用初始化方法“init”为对象初始化

(3)对象创建后,内存中就有了一个对象的实实在在的存在——实例

0f0ca8141ee16067cf37235f3a709bc8.png

2)定义:

(1)创建出来的对象叫做类的实例

(2)创建对象的动作叫做实例化

(3)对象的属性叫做实例属性

(4)对象调用的方法叫做实例方法

3)程序执行:

(1)对象各自拥有自己的实例属性

(2)调用对象方法,可以通过self.

访问自己的属性

调用自己的方法

4)结论:

(1)每一个对象都有自己独立的内存空间,保存各自不同的属性

(2)多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部

6.1.2 类是一个特殊的对象

Python中一切皆对象:

class AAA:AAA属于类对象

obj1 = AAA():obj1属于实例对象

在程序运行时,类同样会被加载到内存

在Python中,类是一个特殊的对象——类对象

在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例

除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法:

类属性

类方法

通过“类名.”的方式可以访问类的属性或者调用类的方法

0e2d654539d1caf83903a436a9a61acd.png

6.2 类属性和实例属性

6.2.1 概念和使用

类属性就是给类对象中定义的属性

通常用来记录与这个类相关的特征

类属性不会用于记录具体对象的特征

1)需求:

定义一个工具类

每件工具都有自己的name

需要知道使用这个类,创建了多少个工具对象?

2)代码:

34bc6b796ad73fa0a6404bb369bb2f94.png

程序开始运行程序时,会加载类,会执行类中所有代码。

6.2.2 属性的获取机制(科普)

在Python中属性的获取存在一个向上查找机制

d90cf635dd9794d2afb8b814c14d6455.png

f2e9c8f616bd80855e91fe6ae4fb715e.png

因此,要访问类属性有两种方式:

1)类名.类属性

2)对象.类属性 (不推荐)

注意:

如果使用“对象.类属性=值”赋值语句,只会给对象添加一个属性,而不会影响到类属性的值

b66b30913e982ed3522045b32074a05d.png

6.3 类方法和静态方法

6.3.1 类方法

类属性就是针对类对象定义的属性

使用赋值语句在class关键字下方可以定义类属性,类属性用于记录与这个类相关的特征

类方法就是针对类对象定义的方法

在类方法内部可以直接访问类属性或者调用其他的类方法

语法如下:

@classmethod def 类方法名(cls): pass

1)概念

(1)类方法需要用修饰器“@classmethod”来标识,告诉解释器这是一个类方法

(2)类方法的第一个参数应该是cls

由哪一个类调用的方法,方法内的cls就是哪一个类的引用

这个参数和实例方法的第一个参数是self类似

提示:使用其他名称也可以,不过习惯使用cls

(3)通过“类名.”调用类方法,调用方法时,不需要传递cls参数

(4)在方法内部:

可以通过cls.访问类的属性

也可以通过cls.调用其他的类方法

2)示例

需求:

(1)定义一个工具类

(2)每件工具都有自己的name

(3)在类封装一个show_tool_count的类方法,输出使用当前这个类,创建的对象个数

0d2a65bee9556720758544c240546ec9.png

3)代码

b1c89fee98ecbb5f6bf3d7171533a5fc.png

在类方法内部,可以直接使用“cls.”访问类属性或者调用类方法

6.3.2 静态方法

在开发时,如果需要在类中封装一个方法,这个方法既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法。

这个时候,可以把这个方法封装成一个静态方法

语法如下:

@staticmethod def 静态方法名(): pass

静态方法名后面的“()”中,不需要self(对象方法),也不需要cls(类方法),直接输入形参即可。

静态方法需要用修饰器“@staticmethod”来标识,告诉解释器这是一个静态方法

通过“类名.”调用静态方法,不需要创建对象

d615fa5a5de3dd6eca25f36eb77d828b.png

6.3.3 方法综合案例

1)需求

(1)设计一个Game类

(2)属性:

定义一个类属性top_score记录游戏的历史最高分

定义一个实例属性player_name记录当前游戏的玩家姓名

(3)方法:

静态方法show_help显示游戏帮助信息

类方法show_top_score显示历史最高分

实例方法start_game开始当前玩家的游戏

(4)主程序步骤

查看帮助信息

查看历史最高分

创建游戏对象,开始游戏

386d9ebc6613a0d91dc079acf90f0cc8.png

2)代码

dcd899235f743a5dde64fb075b0eb48c.png

4dba831b41c2bb95fe3bd3e3bc4014c3.png

3b71786c2c34476c8a5117733264cc07.png

3)案例小结

(1)实例方法:方法内部需要访问实例属性

实例方法内部可以使用“类名.”访问类属性

(2)类方法:方法内部只需要访问类属性

(3)静态方法:方法内部,不需要访问实例属性和类属性

如果方法内部即需要访问实例属性,又需要访问类属性,应该定义实例方法。因为,类只有一个,在实例方法内部可以使用类名.访问类属性

6.4 类的成员

6.4.1 变量

1)实例变量 -> 对象属性 -> 使用“对象.”访问

2)类变量 -> 类属性-> 使用“类名.”访问

6.4.2 方法

1)实例方法 -> 对象方法 -> 第一个参数写“self”,使用“对象.”访问

2)类方法 -> 第一个参数写“cls”,用 “@classmethod”来标识,使用“类名.”访问

3)静态方法 ->用“@staticmethod”来标识,使用“类名.”访问

6.4.3 property装饰器

使用“@property”来标识,可以将方法装饰成属性。类似其它语言中的getter

2a00943fef84aa52bd35f8846b3e5538.png

被“@property”装饰的属性,每次获取数据时都是实时计算的。如果写到初始化方法中,只会在Person类初始化时,计算一次。

被“@property”装饰的属性,只能取值,不能赋值

可以使用“@property”装饰读取私有属性

619b249a244e6c36970a79d41880769c.png

6.4.4 setter装饰器

setter装饰器允许你对已用@property装饰的属性(函数)赋值

0f038ec11d52de71e0a60e0f6a82a56f.png

6.5 类与类之间的关系(重点)

6.5.1 依赖关系(松散)

依赖关系:执行某个动作的时候,调用其它类来完成这个操作。

依赖关系中类与类之间的关系是最松散的.

4a5d41d00633696202e9bf54f6097347.png

执行结果:

4abe19d014356dc1930c2877d273a2a4.png

6.5.2 关联关系(组合、聚合)

关联关系:把另一个类的对象作为当前这个类的一个属性

对象里面包含对象:对象.对象

1)关联关系一对一

3f8424db993ecfbd0271c79e6f25ba5c.png

运行结果:

a039152727574cbd38a4d2adbfdff6f9.png

fadc1b8ae204ec7dc817c21bdb6204e9.png

运行结果:

f685202fbb51c25025f0683186346965.png

2)关联关系一对多(使用最多)

9ef230eb03ee4339908e992c6fd7ce56.png

执行结果:

b13e310087bbd4d89a5f275255960cf1.png

一个人可以有多个订单

一个订单内可以有多个商品

一个领导多个员工

6.5.3 继承关系,实现关系(紧密)

6.6 方法和函数(了解)

6.6.1 函数: 函数不需要绑定对象

19732acb9d86b18b5f6804371faefac2.png

5ef59ce26a0696130315d75f7efa4a6c.png

6.6.2 实例方法:

1)对象.方法 -> 方法

2)类名.方法 -> 函数

495c7b44d5791aa259113a5f2e60b680.png

6.6.3 类方法:

不论如何调用都是方法,因为类也是对象,Python中万物皆对象

00e97e779e9ca5a4c793ab627d51801e.png

类对象的属性:类变量

类对象的功能:类方法

type是所有类的根,类是由type创建的

6.6.4 静态方法

不论如何调用都是函数

19eadc145426ac7c85527074b6da70b0.png

6.6.5 判断函数和方法:FunctionType, MethodType

656ef92a6da00c1dfa6778302dd6905b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值