如何使用类方法创建自定义类实例?

时间:2016-10-27 14:52:44

标签: python class instance static-methods class-method

我对Python OOP很新,并且尝试创建一个类,我可以根据我是否要自定义实例来生成这两种方式的实例:

alien_one = Alien(1)
alien_two = Alien(1).customize(anger=5, emotion=1)

我在使用classmethods和staticmethods之后得到了以下代码,我觉得我应该根据其他线程使用这些代码:

class Alien(object):
    def __init__(self, polarity):
        self.polarity = {1 : 'friendly', 2 : 'aggressive'}

    def customize(self, **kwargs):
        for event in kwargs:
            # // process events to change self.polarity
        return self

此代码是否适合创建Alien实例,或者我是否应该使用方法装饰器来生成实例?在我开始之前,有一些事情让人感到不安。

编辑:感谢所有回复,普遍的共识是将任何表达式或kwargs传递给__init__。我所指的一些示例代码看起来像这样:

query = Tweet.update(is_published=True).where(Tweet.creation_date < today)

这是一个来自Peewee ORM的例子。当我试图在我的类中使用方法装饰器(静态/类)时,我丢失了is_published参数并且无法访问它。为了更清楚地理解,任何人都可以解释如何在类对象中接收is_publishedTweet.creation_date,看起来查询确实是Tweet类的全新实例。我只是以Peewee为例来理解这段代码是如何运作的,而不是试图弄清楚Peewee的任何细节是如何运作的。

2 个答案:

答案 0 :(得分:0)

据推测,你这样做是为了在创建后改变你的实例。如果是这种情况,请考虑重构代码以实现不变性,因为very real advantages in many situations。如果您没有变异,请参考@katy lavallee的建议并将其移至__init __。

您可以使用构建的setattr以编程方式设置实例上的字段:

for key, val in kwargs.items():
    setattr(self, key, val)

如果这是python 2(如果是,请进行切换),你想要用iteritems()替换对items()的调用。

答案 1 :(得分:0)

我认为首先要定义哪些属性应该是内部的,哪些属性应该暴露给接口。例如,您可能希望极性为内部属性,具体取决于愤怒。

class Alien(object):

    polarity = 1
    polarity_names = {1 : 'friendly', 2 : 'aggressive'}

    def __init__(self, anger=1):
        self.customize(
            anger = anger,
        )

    def get_polarity(self):
        return self.polarity_names[self.polarity]

    def customize(self, **kwargs):
        for feeling_name, feeling_intensity in kwargs.items():
            if feeling_name == 'anger':
                self.polarity = feeling_intensity


alien_one = Alien()
print('Alien 1 polarity: ' + alien_one.get_polarity())

alien_two = Alien(anger=2)
print('Alien 2 polarity: ' + alien_two.get_polarity())