@classmethod用于构造函数重载

时间:2018-07-26 14:47:04

标签: python python-3.x constructor class-method

我通常使用isinstance进行构造函数重载,但人们也建议使用@classmethod。但是据我所知@classmethod共享变量。

下面是一个简单的类

class abc:
    def __init__(self, a=0):
        self.a = a    

    @classmethod
    def from_const(cls, b=30):
        cls.b = b
        return cls(10)

    def printme(self):
        print(self.a,self.b)

现在,让我们制作三个对象

a1 = abc(a=100)
a2 = abc.from_const(b=31)
a3 = abc.from_const(b=41)
a4 = abc().from_const(b=51)
a5 = abc().from_const(b=61)


a1.printme()
a2.printme()
a3.printme()
a4.printme()
a5.printme()

输出:

100 61
10 61
10 61
10 61
10 61

现在我有两个问题,

  • 是否可以使@classmethod不共享类变量?
  • 如何正确使用@classmethod进行构造函数重载?

1 个答案:

答案 0 :(得分:2)

也许您想先初始化实例,然后在类中为其分配b

这是主意:

class abc:
    def __init__(self, a=0):
        self.a = a
        self.b = None

    @classmethod
    def from_const(cls, b=30):
        instance = cls(10)
        instance.b = b
        return instance

    def printme(self):
        print(self.a,self.b)

a1 = abc(a=100)
a2 = abc.from_const(b=31)
a3 = abc.from_const(b=41)
a4 = abc.from_const(b=51)
a5 = abc.from_const(b=61)

输出:

(100, None)
(10, 31)
(10, 41)
(10, 51)
(10, 61)