首页
学习
活动
专区
圈层
工具
发布

类继承
EN

Stack Overflow用户
提问于 2017-02-21 05:09:06
回答 2查看 67关注 0票数 4

考虑以下代码:

代码语言:javascript
复制
class A(object):
    a = []

    @classmethod
    def eat(cls, func):
        print "called", func
        cls.a.append(func)


class B(A):
    @A.eat
    def apple(self, x):
        print x

    A.eat(lambda x: x + 1)


print A.a

输出:called <function apple at 0x1048fba28> called <function <lambda> at 0x1048fbaa0> [<function apple at 0x1048fba28>, <function <lambda> at 0x1048fbaa0>]

我以为A.a是空的,因为我们还没有创建一个object.How,2函数在这里被添加了吗?究竟是什么导致eat被称为2时间?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-21 05:20:44

因为一个类定义是可执行语句。

类主体内的任何代码(但在函数定义之外)都将在运行时执行。

如果希望只在类对象被实例化时运行代码,请将其放入__init__类方法中。

请注意,一些教程错了,这无疑增加了混淆:

定义类时不运行代码--您只是在创建函数和变量。

这是完全错误的。

票数 5
EN

Stack Overflow用户

发布于 2017-02-21 05:14:31

导入模块时执行类体定义。

这也意味着还将执行装饰器,将apple函数对象传递给A.eat,然后将返回值绑定到您传递的函数的名称(apple)。

您可以在这里更多地了解Python的执行模型:https://docs.python.org/2/reference/executionmodel.html

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42359156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档