Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从类函数调用返回对象_Python_Oop_Object - Fatal编程技术网

Python 从类函数调用返回对象

Python 从类函数调用返回对象,python,oop,object,Python,Oop,Object,我现在有两个类调用,就像这样 first_partition = Partition(samplename='Sample1', nS=5) second_partition = Partition(samplename='Sample2', nS=6, batchname = 'Batch1', nB=4). 由于partition类接受可变数量的参数,因此在我的init中,我有: class Partition: def __init__(self, **kwargs):

我现在有两个类调用,就像这样

first_partition = Partition(samplename='Sample1', nS=5)
second_partition = Partition(samplename='Sample2', nS=6, batchname = 'Batch1', nB=4).
由于partition类接受可变数量的参数,因此在我的init中,我有:

class Partition:

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
我想要的是让第一个分区和第二个分区返回一个分区对象的实例,其中包含两个实例变量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\uu init\uuuuuuuu
不能返回任何东西,所以我尝试了
def\uuuuu new\uuuuuuuuuu
而不是def pobject,但它不起作用,并给了我一个
atributeerror

您可以更改
\uu new\uuuuuuuuuuuuuuuuu()
来检查传递的参数并基于此返回各种数据,不一定是实例本身:

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)

但在这一点上,您正在通过攻击类行为来模拟工厂函数。如果你想要一个工厂函数,那就制作一个工厂函数。

如果你只想要
k
n
,或者如果你想要实例,为什么这甚至是一个类,为什么不在
\uuuu init\uuuu
中设置
k
n
属性?您可以在类中定义一个自定义的
\uuu调用
方法,然后只需执行以下操作:
打印分区(samplename='Sample1',nS=5)()
调用
\uuu\uuu
然后可以分派到
pobject
方法我知道作为一个函数更好,但我的要求是我必须作为一个类来实现。