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

标签 python class instance static-methods class-method

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

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

在弄乱了类方法和静态方法之后,我得到了以下代码,我觉得我应该根据其他线程使用它们:

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 是如何在类对象中被接收的,看起来 query 是一个全新的实例推文课。我仅以 Peewee 为例来了解这段代码的工作原理,而不是试图弄清楚 Peewee 本身的工作原理。

最佳答案

大概您这样做是为了在创建后改变您的实例。如果是这种情况,请考虑重组代码以实现不变性,因为有 very real advantages in many situations。 .如果您不进行变异,请采纳@katy lavallee 的建议并将其移至 __init__。

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

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

如果这是 python 2(如果是,请进行切换),您需要将对 items() 的调用替换为 iteritems()。

关于python - 如何使用类方法创建自定义类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40287819/

相关文章:

python - 在 AWS S3 中分块创建大型 zip 文件

c++ - 如何通过获取用户输入来设置类的常量成员值?

c++ - 无法在静态类函数中递增静态变量

Python:pytz 返回不可用的 __repr__()

python - 使用 2 级 XML 查找节点并添加字符串

python - Python 如何以不同方式接收标准输入和参数?

java - 在调用父类(super class)型之前无法引用 java

json - 删除 Lambda 支持的自定义资源的支持 Lambda 函数

Python virtualenv pip 安装 MySQL-Python 导致 "RuntimeError: maximum recursion depth exceeded"

Java Action 监听器action在不同的类中执行