从类函数调用返回对象

时间:2017-07-14 19:01:02

标签: python oop object

我目前有两个类的调用,就像这样。

first_partition = Partition(samplename='Sample1', nS=5)
second_partition = Partition(samplename='Sample2', nS=6, batchname = 'Batch1', nB=4).

由于分区类接受可变数量的参数,在我的init中,我有:

class Partition:

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

我想要的是让first_partition和second_partition返回一个分区对象的实例,它有两个实例变量 - k和n - 取决于我调用的输入。

我有一个单独的类方法试图这样做:

def pobject(self):
    nargin = len(self.__dict__)
    # Return default object if no arguments
    if nargin == 0:
        self.n = 3
        self.k = 0
        return self.n, self.j
    else if nargin == 2:
        self.n = 0
        self.k = self.nS + 1
        return self.n, self.j

但要返回k和n,我必须这样做:

first_partition = Partition(samplename='Sample1', nS=5)
print(first_partition.pobject())

我想要的是第一行在我打电话时返回一些东西

first_partition = Partition(samplename='Sample1', nS=5)

我知道def __init__无法返回任何内容,所以我尝试了def __new__而不是def pobject但是它没有工作并给了我AtrributeError

1 个答案:

答案 0 :(得分:0)

您可以更改__new__()以对传递的参数进行检查,并根据该参数返回各种数据,不一定是实例本身:

class Partition(object):

    def __new__(cls, **kwargs):
        nargin = len(kwargs)
        if nargin == 0:
            return 3, 0
        elif nargin == 2:
            return 0, kwargs["nS"] + 1
        # in other cases return a class instance...
        return super(Partition, cls).__new__(cls)

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

但此时你正在通过黑客攻击类行为来模拟工厂功能。如果您需要工厂功能,请创建工厂功能。