Python - 在对象实例化期间设置类属性(构造)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - 在对象实例化期间设置类属性(构造)相关的知识,希望对你有一定的参考价值。

我有一个属性必须只设置一次的类(让我们通过命令行参数说)。从那以后它是不可改变的。

class Example(object):
    _classattribute = None

我这样做是通过读取命令行参数,并在对象构造期间将它们作为参数传递。根据classatribute,我返回一个不同的对象Type。

class Example(object):
    _classattribute = None
    _instance = None

    def __new__(cls, attribute=None):
        if not cls._clsattribute:
             if not attribute:
                raise ValueError('class attribute not set')
            cls._clsattribute = attribute
        if cls._classatribute == condition1:
            cls._instance = Type1(cls._classattribute)
        if cls._classatribute == condition2:
            cls._instance = Type2(cls._classattribute)
        return cls._instance


class Type1:
    def __init__(self, property):
        self.property = property

class Type2:
    def __init__(self, property):
        self.property = property

在对象构建期间,这是第一次:

eg1 = Example("This is type1 attribute")

随后构建对象:

eg2 = Example()

这是一个我不能说的好方法。这对我来说太明确了。除了类属性_claassattribute的一次设置之外,它类似于Borg,共享状态模式。

任何形式的批评/反馈/思想/建议都是受欢迎的。

答案

这是个人设计选择,但我对此的看法是,__new__应该总是返回班级或None的对象。在您的代码中,如果它永远不会返回自己的实例,则没有理由使用class。你可能想要的东西包括一个返回Type1Type2对象的工厂。

def get_type_factory(attribute):

    if attribution == condition1:
        return lambda: Type1(attribute)
    elif attribute == condition2:
        return lambda: Type2(attribute)
    else:
        raise ValueError

# Can be used like so
factory = get_type_factory('foo')

type_object1 = factory()
type_object2 = factory()

以上是关于Python - 在对象实例化期间设置类属性(构造)的主要内容,如果未能解决你的问题,请参考以下文章

构造函数、ECMAscript(ES6)

Python类与对象最全总结大全(类实例属性方法继承派生多态内建函数)

python20181217 面向对象的学习总结

java类实例化内存过程与面向对象特征

Python_类与实例的属性关系

day8-Python学习笔记(十八)面向对象,self,私有,属性方法