如何为中心和半径= 1设置默认值Point(0,0)?

时间:2017-12-08 07:44:58

标签: python

请帮我修改这个圆圈,(1)设置默认实例。

圆类使用Point对象作为中心。使用center和radius关键字,以center为第一个参数。使用 repr str 。将点对象和半径值指定给圆时, the output should look like this for assigned values

this is what I am getting

没有输入的圆的默认值为:以a的默认实例为中心     点对象,半径为1。

This is how the output should look like for default values

This is what I am getting for defaults

如果我要更改以下内容

def __repr__(self):
      return "Circle(center=Point({0}, {1}), radius {2})"
                 .format(self.center[0],self.center[1],self.radius)

到此:

 import math
class Point:
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y  
    def __iter__(self):
        yield self.x
        yield self.y    
    def __add__(self,other):
        return Point(self.x+other.x,self.y+other.y) 
    def __mul__(self,n):
        return Point(self.x*n,self.y*n) 
    def __rmul__(self,n):
        return Point(n*self.x,n*self.y) 
    @classmethod
    def from_tuple (cls, self=(0,0)):
        return cls(*self)   
    def loc_from_tuple(self,t=(0,0)):
        self.x=t[0]
        self.y=t[1] 
    def __str__(self):
        return "Point at ({0}, {1})".format(self.x,self.y)  
    def __repr__(self):
        return"Point(x={0}, y={1})".format(self.x,self.y)   
    @property
    def magnitude(self):
        return math.sqrt(self.x**2+self.y**2)   
    def distance (self, other):
        return math.sqrt((self.x-other.x)**2+(self.y-other.y)**2)       
    def shift(p1, p2):
        mx = p1.x+p2.x
        my = p1.y+p2.y
        return Point(mx,my) 
class Circle(Point):
    def __init__(self, center=(0,0), radius=1):
        Point.__init__(self,center)
        self.center=center
        self.radius=radius
    def __str__(self):
        return "Circle with center at ({0}, {1}) and radius {2}"
        .format(self.center.x, self.center.y, self.radius)
    def __repr__(self):
        return "Circle(center=Point({0}, {1}), radius={2})"
        .format(self.center.x,self.center.y,self.radius)
    def __add__(self,other):
        return Circle(
        Point(self.center.x+other.center.x,
        self.center.y+other.center.y),
        self.radius+other.radius)
    @classmethod
    def from_tuple(cls, center,radius):
        return cls(center, radius)
    @property
    def radius(self):
        return self._radius
    @radius.setter
    def radius(self, radius):
        if radius<0:
            raise ValueError('The radius cannot be negative')
        self._radius=radius
    @property
    def diameter(self):
        return self._radius*2
    @diameter.setter
    def diameter(self, diameter):
        if diameter<0:
            raise ValueError('The radius cannot be negative')
        self._radius = diameter/2
    @property
    def area(self):
        return math.pi*self.radius**2

这将产生错误,因为指定中心点(2,3)的点对象不支持索引。

{{1}}

2 个答案:

答案 0 :(得分:0)

Center是一个元组,因此它没有属性x。在这里你定义中心:

class Circle(Point):
    def __init__(self, center=(0,0), radius=1):
        Point.__init__(self,center)
        self.center=center

在这里你打电话给center.x

def __repr__(self):
    return "Circle(center=Point({0}, {1}), radius={2})"
    .format(self.center.x,self.center.y,self.radius)

快速解决方法是将__repr__更改为:

def __repr__(self):
    return "Circle(center=Point({0}, {1}), radius={2})"
    .format(self.center[0],self.center[1],self.radius)

这样你就可以为元组编制索引。另一种方法是将中心设为像center = {'x':0, 'y'0}这样的字典。然后__repr__将按原样运行,但您必须完成其余程序以确保一致性。

答案 1 :(得分:0)

错误消息告诉您需要知道的一切:     AttributeError:&#39;元组&#39;对象没有属性&#39; x&#39;

违规行是这一行:

return "Circle(center=Point({0}, {1}), radius={2})"
.format(self.center.x,self.center.y,self.radius)

对象center是一个元组,意味着它的变量是使用索引而不是属性名来访问的。请尝试改为:

return "Circle(center=Point({0}, {1}), radius={2})"
.format(self.center[0],self.center[1],self.radius)

更好的方法是实际使用Circle中的Point继承并直接访问xy - 没有理由保留center作为实例变量,如果你已经拥有了所有你需要的东西:

return "Circle(center=Point({0}, {1}), radius={2})"
.format(self.x,self.y,self.radius)