相关疑难解决方法(0)

我不明白这个python __del__行为

有人可以解释为什么以下代码的行为方式如下:

import types

class Dummy():
    def __init__(self, name):
        self.name = name
    def __del__(self):
        print "delete",self.name

d1 = Dummy("d1")
del d1
d1 = None
print "after d1"

d2 = Dummy("d2")
def func(self):
    print "func called"
d2.func = types.MethodType(func, d2)
d2.func()
del d2
d2 = None
print "after d2"

d3 = Dummy("d3")
def func(self):
    print "func called"
d3.func = types.MethodType(func, d3)
d3.func()
d3.func = None
del d3
d3 = None
print "after d3"
Run Code Online (Sandbox Code Playgroud)

输出(注意d2的析构函数从不被调用)是这个(python 2.7)

delete d1
after d1
func called
after …
Run Code Online (Sandbox Code Playgroud)

python del

33
推荐指数
4
解决办法
4万
查看次数

类装饰器,继承,超级()和最大递归

我试图弄清楚如何在使用的子类上使用装饰器super().由于我的类装饰器创建了另一个子类,因此装饰类似乎可以防止在super()更改className传递给它时使用super(className, self).以下是一个例子:

def class_decorator(cls):
    class _DecoratedClass(cls):
        def __init__(self):
            return super(_DecoratedClass, self).__init__()
    return _DecoratedClass

class BaseClass(object):
    def __init__(self):
        print "class: %s" % self.__class__.__name__
    def print_class(self):
        print "class: %s" % self.__class__.__name__

bc = BaseClass().print_class()

class SubClass(BaseClass):
    def print_class(self):
        super(SubClass, self).print_class()

sc = SubClass().print_class()

@class_decorator
class SubClassAgain(BaseClass):
    def print_class(self):
        super(SubClassAgain, self).print_class()

sca = SubClassAgain()
# sca.print_class() # Uncomment for maximum recursion
Run Code Online (Sandbox Code Playgroud)

输出应该是:

class: BaseClass
class: BaseClass
class: SubClass
class: SubClass
class: _DecoratedClass
Traceback (most recent …
Run Code Online (Sandbox Code Playgroud)

python decorator

7
推荐指数
2
解决办法
5670
查看次数

标签 统计

python ×2

decorator ×1

del ×1