目录
一、析构方法__del __
del方法用于实现对象销毁所需的操作,比如释放对象占用的资源,打开网络连接等,
Python实现自动的垃圾回收机制,当对象没有被引用时(引用计数为),由垃圾回收器调用__del __()方法,系统会自动提供__del__方法,一般不用自定义析构方法,我们也可以通过del语句删除对象,该方法确保调用该方法
二、__call__方法和可调用对象
定义了__call__()方法的的对象成为可调用对象,即该对象可像函数一样被调用
三.方法无重载
其他语言中可定义多个重名方法,只要方法签名一致即刻(方法签名包含:方法名,参数数量,参数类型)
而Python中参数没有声明类型,参数数量也确定(可以由可变参数控制),因此Python是没有方法重载的,但定义一个方法即可有多个调用方式,也就相当于实现了方法的重载
如果定义了多个同名方法,只有最后一个有效(不建议重名)
四.方法的动态性:
我们可以为类添加新的方法,或动态的修改类的已有方法
class person:
def work(self):
print("啊这是一个方法")
def play_game(self):
print("我爱摸鱼")
def work2(self):
print("啊,那个方法摸鱼去了")
#—————————————————————————————结果————————————————————————————————————————————
>>>
#========================== RESTART: D:/Pwork/ff.py ==========================
>>> p=person()
>>> p.work()#类内方法可以调用
啊这是一个方法
>>> p.play_game()#非类内方法不可以调用
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
p.play_game()
AttributeError: 'person' object has no attribute 'play_game'
>>> p.work2()#非类内方法不可以调用
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
p.work2()
AttributeError: 'person' object has no attribute 'work2'
>>> p.play=play_game#将play_game添加到类
>>> p.play(1)#可以运行,无参数会报错,例子如下work
我爱摸鱼
#———————————————————————————————————————————————————————————————————————————————
>>> p.work=work2
>>> p.work()#无参数报错
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
p.work()
TypeError: work2() missing 1 required positional argument: 'self'
>>> p.work(1)#新方法替换了work
啊,那个方法摸鱼去了
>>>
五. 私有属性和私有方法(实现封装)
Python对于类成员没有严格的访问限制,私有属性和私有方法有如下要点:
- 约定双下划线开头,属性为私有(private),其他为公共的
- 类内部可以直接访问私有方法(属性)
- 类外部不可以直接访问私有方法(属性)
- 类外部可以通过“_(单下划线)类名__(双下划线)私有属性(方法)名”访问私有属性(方法)
方法本质上也是属性!只不过是可以通过()执行而已。所以,此处讲的私有属性和公
有属性,也同时讲解了私有方法和公有方法的用法
例子
class person:
__name="没有名字"#私有类属性 dir可以查到
ame="名字"
def __init__(self,age,fish):
self.__age=age#类私有实例属性
self.fish=fish
def work(self):#公共实例方法
print(f"啊这是一个方法,它{self.__age}岁,它叫",person.__name)#类内部可以直接访问私有属性
def __play(self):#私有实例方法
print(str(self.__age)+"岁的我爱摸的",self.fish,"但摸不着")
>>>
#========================== RESTART: D:/Pwork/ff.py ==========================
>>> p=person(12,"我不是鱼")
>>> p.work()#类内部可以直接访问私有属性
啊这是一个方法,它12岁,它叫 没有名字
>>> p.ame#可以直接访问公共属性
'名字'
>>> p.__name#不可以直接访问私有属性
Traceback (most recent call last):
File "<pyshell#73>", line 1, in <module>
p.__name
AttributeError: 'person' object has no attribute '__name'
>>>
#——————————————————————————外部调用私有方法———————————————————————————————————————————
>>> p._person__play()#不可以直接访问私有方法
12岁的我爱摸的 我不是鱼 但摸不着
>>> p.__play()#不可以直接访问私有方法
Traceback (most recent call last):
File "<pyshell#128>", line 1, in <module>
p.__play()
AttributeError: 'person' object has no attribute '__play'
>>>