假期第(24)天
实例方法
l Python类的成员方法大致可以分为公有方法、私有方
法、静态方法、类方法和抽象方法这几种类型
l 公有方法、私有方法和抽象方法一般是指属于对象的
实例方法,私有方法名以两个下划线"__"开始,而抽
象方法定义在抽象类中要求派生类必须重新实现。在
外部,公有方法通过对象名直接调用,私有方法不能
通过对象名直接调用,只能在其他实例方法中通过前
缀"self"进行调用或通过转换形式来调用
l 所有实例方法(包括公有方法、私有方法、
抽
象
方
法
和某些特殊方法)都必须至少有一个名为
s
el
f
(也
可
以使用其他标识符)的参数,并且必
须
是方
法
的
第
一
个形参(如果有多个形参的话),sel
f参数代表当前
对象
l 在实例方法中访问实例成员时需要以sel
f为前缀,但
在外部通过对象名调用对象方法时并不
需
要传递这个
参数(仅限于已绑定的实例方法)
l 如果在外部通过类
名
调
用
属
于
对
象
的
公
有
方
法
,
需
要
显式为该方法的
sel
f参
数
传
递
一
个
对
象
名
,
用
来
明
确
指定访问哪个对象
的
成
员
类的成员18
1
8
类方法和静态方法
l 静态方法和类方法都可以通过类名和对象名调用,但
不能直接访问属于对象的成员,只能访问属于类的成
员
l 静态方法和类方法不属于任何实例,不会绑定到任何
实例,当然也不依赖于任何实例的状态,与实例方法
相比能够减少很多开销
l 类方法一般以cls作为
类
方
法
的
第
一
个
参
数
表
示
该
类
自身,在调用类
方法时
不
需
要
为
该
参
数
传
递
值
,
静
态
方法则可以不接收任何参数。类方法一般通过
c
ls
参
数或类名访问类成员,静态方法通过类名访问类
成
员
l 通过内置修饰器定义类方法和静态方法
l @staticmethod:用于声明类的静态方法
l @classmethod:用于声明类的类方法
类的成员1
9
19
静态方法与类方法示例
【
04P19.py】
l class Root:
l __total = 0
l def __init__(self, v):
#构造方法
l self.__value = v
l Root.__total += 1
l def show(self):
#普通实例方法
l print('self.__value:', self.__value)
l print('Root.__total:', Root.__total)
l @classmethod
#修饰器,声明
类方法
l def classShowTotal(cls): #类方法
l print(cls.__total)
l @staticmethod
#修饰器,声明
静态方法
l def staticShowTotal():
#静态方法
l print(Root.__total)
l r = Root(3)
l r.classShowTotal()
#通过对象来调用类方法
l r.staticShowTotal()
#通过对象来调用静态方法
l Root.classShowTotal()
#通过类名调用类方法
l Root.staticShowTotal()
#通过类名调用静态方法
l Ro
ot.
show(r)#通过类名调用实例方法时须为self参数显式传递
对象
名
类的成员
输出结果:
1
1
1
1
self.__value: 3
Root.__total: 12
0
2
0
抽象方法【
04P20.py】
l 抽象类需导入 abc模块:from abc import ABCMeta,
abstractmethod
l 抽象方法一般在抽象类中定义,并且要求在派生类中
必须重新实现,否则不允许派生类创建实例
l import abc
l class Foo(metaclass=abc.ABCMeta): #抽象类
l def f1(self):
#普通实例方法
l print(123)
l @abc.abstractmethod #抽象方法
l def f2(self):
l raise Exception('You must reimplement this method.') #触
发异常
l class Bar(Foo):
l def f2(self):
#必须重新实现基类中的抽象方法
l print(33333)
l b = Bar()
l b.f2()
类的成员
输出结果:
333332
1
21
属性
l 公开的数据成员可以在外部随意访问和修改,很难控
制用户修改时新数据的合法性
l 解决这一问题的常用方法是定义私有数据成员,然后
设计公有成员方法来提供对私有数据成员的读取和修
改操作,修改私有数据成员时可以对值进行合法性检
查,提高了程序的健壮性,保证了数据的完整性
l 属性结合了公开数据成员和成员方法的优点,既可以
像成员方法那样对值进行必要的检查,又可以像数据
成员一样灵活的访问
l @property:用于声明类属性
l property对象:用于声明类属性
类的成员2
2
2
2
只读属性
l property对象【
04P22-1.py】
l @property修饰器【
04P22-2.py】
l import types
l class Test:
l def __init__(self, value):
l self.__value = value
l @property
l def value(self): #只读,无法修改和删除
l return self.__value
l t = Test(3)
l print(t.value)
l ##t.value = 5
#只读属性不允许修改值
l t.v=5
#动态增加新数据成员
l print(t.v)
l del t.v
#动态删除成员
l ##del t.value
#试图删除对象属性,失败
l Test.a="Mode0" #试图增加类数据成员
l print(Test.a)
类的成员
输出结果:
3
5
Mode023
2
3
可读、可写属性
l property对象【
04P23-1.py】
l @property修饰器【
04P23-2.py】
l class Test:
l def __init__(self, value):
l self.__value = value
l def __get(self):
l return self.__value
l def __set(self, v):
l self.__value = v
l value = property(__get, __set)
l def show(self):
l print(self.__value)
l t = Test(3)
l print(t.value) #允许读取属性值
l t.value = 5 #允许修改属性值
l t.show() #属性对应的私有变量也得到了相应的修改
l #del t.value #试图删除属性,失败
类的成员
输出结果:
3
52
4
2
4
可读、可修改、可删除的属性
l property对象【
04P24-1.py】
l @property修饰器【
04P24-2.py】#属性三种访问方式分别
对应被@property、@方法名.setter、@方法名.deleter修饰的方法
l class Test:
l def __init__(self, value):
l self.__value = value
l @property
l def value(self):
l return self.__value
l @value.setter
l def value(self, v):
l self.__value = v
l @value.deleter
l def value(self):
l del self.__value
l def show(self):
l print(self.__value)
l t = Test(3)
l t.value = 5
l print(t.value)
l del t.value
#删除属性
l
t
.
v
a
lu
e
=
1 #为对象动态增加属性和对应的私有数据成员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构