首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中,从导入时包含的模块初始化类可以吗?

在Python中,从导入时包含的模块初始化类可以吗?
EN

Stack Overflow用户
提问于 2018-04-02 15:42:27
回答 1查看 66关注 0票数 4

我正在使用Python2.7

我想知道在Python中,是否可以在模块级别添加代码来初始化模块中包含的类。

代码语言:javascript
复制
class DoSomething(object):

    foo = 0
    bar = 0

    @classmethod
    def set_all_to_five(cls):
        cls.bar = 5
        cls.foo = 5

    @classmethod
    def set_all_to_ten(cls):
        cls.bar = 10
        cls.foo = 10


#Module level code - runs on import of the class DoSomething
DoSomething.set_all_to_five()

输出:

代码语言:javascript
复制
>>> from productX.moduleY import DoSomething
>>> print DoSomething.bar
5

这个类只包含@classmethod方法,所以我可以调用它们,而不必实例化类。

模块级code DoSomething.set_all_to_5()在导入模块时初始化类级属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-02 16:00:19

在模块级别添加代码以初始化模块中包含的类可以吗?

是的,你所拥有的一切都很好。当人们将“动态”描述为一种动态语言时,这就是这个词的意思:,您可以在运行时中更改类型的定义。定义类的整个模块必须在使用DoSomething名称之前成功导入,因此不可能有人意外地使用类的“未修补”版本。

但是,如果希望类的行为完全在类块中定义,而不是在类定义之后应用"monkeypatch“,则可以使用其他一些选项。

使用元类

代码语言:javascript
复制
class DoSomethingMeta(type):

    def __init__(self, name, bases, attrs):
        super(DoSomethingMeta, self).__init__(name, bases, attrs)
        self.set_all_to_five()


class DoSomething(object):

    __metaclass__ = DoSomethingMeta  # for Python3, pass metaclass kwarg instead

    foo = 0
    bar = 0

    @classmethod
    def set_all_to_five(cls):
        cls.bar = 5
        cls.foo = 5

    @classmethod
    def set_all_to_ten(cls):
        cls.bar = 10
        cls.foo = 10

或者,更简单地说,使用装饰器

代码语言:javascript
复制
def mydecorator(cls):
    cls.set_all_to_five()
    return cls

@mydecorator
class DoSomething(object):
    ....
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49614245

复制
相关文章

相似问题

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