Python 类继承中缺少的方法?

1 投票
1 回答
682 浏览
提问于 2025-04-16 08:47

我对类的继承不是很熟悉。请帮我看看下面的代码:

class Handle(STAFHandle):

    def __init__(self, HandleName):
        handle = STAFHandle.__init__(self, HandleName)
        self.initLogger(handle)

    def initLogger(self, handle):
        self.logger = Logging(handle, 'Test')

handle = Handle('test')
handle.logger.info('test')

它说提交方法没有定义:

result = handle.submit(system, service, logRequest) 
AttributeError: 'NoneType' object has no attribute 'submit'

但是如果我把它改成:

class Handle(STAFHandle):
    def __init__(self, HandleName):
        handle = STAFHandle.__init__(self, HandleName)

    def initLogger(self, handle):
        self.logger = Logging(handle, 'Test')

handle = Handle('test')
handle.initLogger(handle)
handle.logger.info('test')

它就能正常工作了。为什么会有这样的区别呢?非常感谢!!

祝好,

Zhe

1 个回答

4

STAFHandle.__init__ 返回的是 None。你可能想要的是:

class Handle(STAFHandle):
    def __init__(self, handle_name):
        super(Handle, self).__init__(handle_name)
        self.initLogger()

    def initLogger(self):
        self.logger = Logging(self, 'Test')

handle = Handle('test')

记住,__init__ 方法的第一个参数是一个对象,它会对这个对象进行“修改”。所以当你调用 super(Handle, self).__init__(handleName) 的时候,你实际上是在改变 self 的属性,而不是返回一个新的对象。你给出的两个例子之间的区别在于,两个 initLogger 调用中的变量 handle 指向的是不同的东西。

注意,我把明确的 STAFHandle.__init__ 调用换成了 super 代理;在这种情况下,它们是等价的,但这样做更灵活,因为你可以在不破坏 __init__ 的情况下改变类的继承关系。

我还把 HandleName 改成了 handle_name,这样符合 Python 的命名规范(CamelCase 通常用于类名)。

撰写回答