Python do';s和don';初始方法的ts

Python do';s和don';初始方法的ts,python,function,class,initialization,init,Python,Function,Class,Initialization,Init,我只是想知道使用init方法通过一个接一个地调用类中的其余函数来设置变量是否被认为是非常不合适、混乱或非常规的。我做过类似的事情,self.age=Chu age(),其中Chu age是同一个类中的一个函数,并以相同的方式设置了更多变量,如self.name=Chu name()等。另外,在init中提示用户输入,以获得调用Chu age的参数,这又如何呢?我必须说,后者觉得有点不对。欢迎任何意见、建议、训诫 我总是喜欢懒惰:如果你需要初始化构造函数中的所有内容,你应该——在很多情况下,我在我

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

我总是喜欢懒惰:如果你需要初始化构造函数中的所有内容,你应该——在很多情况下,我在我的类中放了一个通用的“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

我总是喜欢懒惰:如果你需要初始化构造函数中的所有东西,你应该——在很多情况下,我在我的类中放了一个通用的“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类)。对于不同类型的对象,重置方法可能还有很多其他用途。因此,属性装饰器似乎正在使用函数的名称,在本例中为“name”,并使用此名称创建属性,一个等于返回值的值?是的…这非常方便。如果你的方法返回两个对象,比如字符串和列表,情况会怎样?属性装饰器能处理这个问题吗?我不明白为什么不能..你只是返回一个元组.+1,因为重置方法基本上是你可以在调用构造函数后随时调用对象实例的东西。重置方法对于作为迭代器实现的类非常有用,因为有时需要重置迭代器的位置(例如,游戏中循环通过多个小图像的spritesheet类)。对于不同类型的对象,重置方法可能还有很多其他用途。因此,属性装饰器似乎正在使用函数的名称,在本例中为“name”,并使用此名称创建属性,一个等于返回值的值?是的…这非常方便。如果你的方法返回两个对象,比如字符串和列表,情况会怎样?房产装饰师能处理吗?我不明白为什么不能..你只是返回一个元组。