2021-07-22十二.析构函数__del___方法和__cal__方法及方法没有重载

目录

一、析构方法__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'
>>> 


  


总结        Python一切皆对象

备忘链接:python调用私有属性的方法总结 - 云+社区 - 腾讯云 (tencent.com)

                Python类的私有属性与私有方法的使用_巨基的博客-CSDN博客_python类私有方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值