【问题标题】:do's and don'ts of __init__ method__init__ 方法的注意事项
【发布时间】:2013-09-06 01:16:37
【问题描述】:

我只是想知道使用 init 方法通过一个接一个地调用类中的其余函数来设置变量是否被认为是非常不合适、只是混乱或非常规.我做过类似 self.age = ch_age() 之类的事情,其中​​ ch_age 是同一类中的一个函数,并以相同的方式设置更多变量,例如 self.name=ch_name() 等。另外,提示用户输入怎么样在 init 中专门获取调用 ch_age 的参数?不得不说,后者感觉有点不对劲。欢迎任何意见、建议、告诫!

【问题讨论】:

    标签: python function class initialization init


    【解决方案1】:

    我总是喜欢懒惰:如果你需要在构造函数中初始化所有东西,你应该——在很多情况下,我在我的类中放置了一个通用的“reset”方法。然后你可以在init中调用那个方法,并且可以很容易地重新初始化类实例。

    但如果你最初不需要这些变量,我觉得最好等到你真正需要它们后再初始化。

    针对您的具体情况

    class Blah1(object):
        def __init__(self):
            self.name=self.ch_name()
        def ch_name(self):
            return 'Ozzy'
    

    你不妨使用属性装饰器。以下将具有相同的效果:

    class Blah2(object):
        def __init__(self):
            pass
    
        @property
        def name():
            return 'Ozzy'
    

    在上述两种实现中,以下代码不应发出任何异常:

    >>> b1 = Blah1()
    >>> b2 = Blah2()
    >>> assert b1.name == 'Ozzy'
    >>> assert b2.name == 'Ozzy' 
    

    如果你想提供一个重置方法,它可能看起来像这样:

    class Blah3(object):
        def __init__(self, name):
            self.reset(name)
        def reset(self, name):
            self.name = name
    

    【讨论】:

    • +1 因为重置方法基本上是您可以随时为对象实例调用的方法,即使在调用构造函数之后也是如此。重置方法对于您实现为迭代器的类非常有用,因为有时您想要重置迭代器的位置(例如,游戏中循环几个小图像的 spritesheet 类)。对于不同类型的对象,reset 方法可能还有很多其他用途。
    • 所以看起来属性装饰器正在使用函数的名称,在本例中为“name”并创建一个具有此名称的属性,并且值等于返回值?
    • 是的...非常方便。
    • 如果您的方法返回两个对象,如字符串和列表,该怎么办?物业装饰师可以处理吗?
    • 我不明白为什么不......你只是返回一个元组。
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2017-01-24
    相关资源
    最近更新 更多