__call__和__del__机制

其他魔术方法:

__call__:如果需要把对象当作一个函数用的时候,重写__call__方法,就能通过实例对象直接调用

比如

class a():
    
    def __call__(self,name):
        
        print('------>',name)


aa=a()

aa('Dillon')
runfile('D:/daima/wecenter/test_case/untitled0.py', wdir='D:/daima/wecenter/test_case')
------> Dillon

 

__del__

引入__del__前先看一个例子:

import sys
class a():
    def __init__(self,name):
        self.name=name
        
    
    def name(self,name):
        print('------>',name)
      
p=a('Tom') 
p1=p
p2=p
p1.name='Jack'
print(p.name)     

print(sys.getrefcount(p))#获取指向这个地址的个数
runfile('D:/daima/wecenter/test_case/untitled0.py', wdir='D:/daima/wecenter/test_case')
Jack
4

p,p1,p2都指向的是一个地址,这个地址中的name,原先name=‘Tom',但是p1.name=‘Jack’,把这个地址中的name值改变了

这时候我要删除一个引用(指向这个地址的对象)del p

import sys
class a():
    def __init__(self,name):
        self.name=name
        
    
    def name(self,name):
        print('------>',name)
        
    def __del__(self):
        print('---del--->')
      
p=a('Tom') 
p1=p
p2=p
p1.name='Jack'
print(p.name)     
del p2
print(sys.getrefcount(p))#获取指向这个地址的个数
runfile('D:/daima/wecenter/test_case/untitled0.py', wdir='D:/daima/wecenter/test_case')
Jack
3
---del--->

1.当一块空间没有了任何引用,默认执行__del__

2.当执行完一段代码后,python解释器会回收这一次执行时开辟的空间,所以最后会如同1步骤,执行__del__

 

 

本文总结

OS_FUNC_ATTRIBUTE_DEFINITION 是一个可调用的对象,它定义了一个名为__call__的方法。通过调用这个对象,可以执行一个线性函数。这个线性函数的定义是通过对象的属性a和b来确定的:给定一个值x,线性函数计算结果为 a * x + b。这个对象的定义如下: ``` class linear: def __init__(self, a, b): self.a, self.b = a, b def __call__(self, x): return self.a * x + self.b ``` 在派生类中重写基类方法并调用基类方法,可以使用super()函数来调用基类方法。通过在派生类中调用super()函数,然后使用点号语法调用基类方法即可。例如,在派生类中调用基类方法的示例代码如下: ``` class BaseClass: def some_method(self): # 代码实现 class DerivedClass(BaseClass): def some_method(self): # 派生类的代码实现 super().some_method() # 调用基类方法 ``` 关于私有属性,Python中并没有真正的私有属性,但是可以通过在属性名前加上两个下划线来表示属性是私有的。这样做的目的是为了提醒其他开发者不要直接访问这些属性,而是通过提供的公共方法来访问。然而,这种约定并不能完全阻止其他开发者访问私有属性,因为Python中的属性访问是基于名称约定的,而不是基于强制的权限控制。因此,其他开发者仍然可以通过修改属性名来访问私有属性。 关于__del__方法,它是一个特殊的方法,用于在对象被销毁之前执行一些清理操作。然而,__del__方法的调用时机是不确定的,它依赖于Python的垃圾回收机制。当一个对象没有被引用时,垃圾回收机制会自动将其销毁,并在销毁之前调用__del__方法。但是,由于垃圾回收的具体时机是不可控的,所以__del__方法可能不会在对象被删除时立即调用。另外,如果对象仍然存在循环引用,垃圾回收机制可能无法正确地销毁对象,从而导致__del__方法不会被调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值