如何将以下两个类组合成一个类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
答案 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