python中的多个构造函数

时间:2017-03-15 20:32:43

标签: python constructor

如何将以下两个类组合成一个类Rectangle,以便可以通过rect = Rectangle(side_a,side_b)或rect = Rectangle(side_a,area)创建Rectangle对象?

class Rectangle1:
    def __init__(self, side_a, side_b):
        self.side_a = side_a
        self.side_b = side_b
        self.area = self.side_a * self.side_b

class Rectangle2:
    def __init__(self, side_a, area):
        self.side_a = side_a
        self.area = area
        self.side_b = self.area / side_a

5 个答案:

答案 0 :(得分:10)

正如here所示。

class Rectangle:

    def __init__(self, a, b):
        """ Create a new rectangle with sides of length a and b.
        """
        self.side_a = side_a
        self.side_b = side_b
        self.area = self.side_a * self.side_b

    @classmethod
    def from_sides(cls, a, b):
        return cls(a, b)

    @classmethod
    def from_area(cls, a, o):
        return cls(a, o/a)

然后您可以创建矩形

r1 = Rectangle.from_sides(s1, s2)
r2 = Rectangle.from_area(s1, a)

答案 1 :(得分:3)

您不能使用相同名称的方法重载方法。好吧,你可以,但只有最后一个可见。

另一个选项是keyword-only个参数。

使用Python 3,你可以写:

class Rectangle:
    def __init__(self, side_a, *, side_b=None, area=None):
        self.side_a = side_a
        if side_b is None and area is None:
            raise Exception("Provide either side_b or area")
        if side_b is not None and area is not None:
            raise Exception("Provide either side_b or area, not both")
        if side_b is not None:
            self.side_b = side_b
            self.area = self.side_a * self.side_b
        else:
            self.area = area
            self.side_b = self.area / side_a

在中间使用*会强制用户使用从该点传递的关键字参数,不允许使用positionnal来防止错误。并且(相当笨拙)手动检查None逻辑确保将一个且仅一个关键字参数传递给构造函数。内部很复杂,但界面使用安全,这是重点。

r = Rectangle(10,area=20)
r2 = Rectangle(10,side_b=20)
r3 = Rectangle(10,20)   # doesn't run, need keyword arguments

答案 2 :(得分:0)

这可能不是你想要的,但这就是我想出的:

class Rectangle:
    def __init__(self, side_a, side_b = None, area = None):
         self.side_a = side_a
         if area == None:
            self.area = side_a * side_b
            self.side_b = side_b
         else:
            self.side_b = area / side_a
            self.area = area

答案 3 :(得分:0)

你可以做到

class Combined:
    def __init__(self, a, b=None, area=None):
        self.a = a
        self.area = self.a * b if b else area
        self.b = self.area / self.a

答案 4 :(得分:0)

我将分享一个基本示例,以在Python中使用默认值和参数化构造函数。您需要在函数定义本身中声明和分配变量以用于默认构造函数。

class Person:

    def __init__(self,name="",age=0):
        self.name=name
        self.age=age
    def __int__(self,name,age):
        self.name=name
        self.age=age

    def showdetails(self):
        print("\nName is "+str(self.name)+" and age is "+str(self.age))

p1=Person("Sam",50)

p1.showdetails()

p2=Person()

p2.showdetails()

输出:

Name is Sam and age is 50

Name is  and age is 0