weixin_46523951
weixin_46523951
2021-05-15 20:54
采纳率: 75%
浏览 19

python创建模块中的包时,怎么处理变量个数未知的情况

例如我写了一个模块,作用是:几何表示系统。目前这个模块能够表示:点、圆、矩形三种几何图形,通过调用函数,可以得知几何图形的属性(例如点的坐标,圆的圆心、半径、面积,矩形的长宽面积等等)

代码如下:(只包含点、圆、矩形三种)

import os
import math
class Geometry(object):
    def __init__(self):
        pass
    @property
    def gtype(self):
        return "gtUNKNOWN"

class Point(Geometry):
    def __init__(self,x,y):
        self._x=x
        self._y=y

    @property
    def gtype(self):
        return "gtPoint"

    @property
    def x(self):
        return self._x
    @x.setter
    def x(self,v):
        self._x=v

    @property
    def y(self):
        return self._y
    @y.setter
    def y(self,v):
        self._y=v

    @property
    def length(self):
        return math.sqrt(self._x**2+self._y**2)

    def __str__(self):
        return "Point (%f,%f)"%(self._x,self._y)
    def __repr__(self):
        return self.__str__()

class Circle(Point):
    def __init__(self,x,y,r):
        Point.__init__(self,x,y)
        self._r=r

    @property
    def area(self):
        return math.pi*self._r*self._r

    @property
    def perimeter(self):
        return 2*math.pi*self._r

    @property
    def gtype(self):
        return "gtCircle"

    @property
    def r(self):
        return self._r
    
    @r.setter
    def r(self,v):
        if v>0:
            self._r=v
        else:
            raise NameError()

    def __str__(self):
        return "Circle(%f,%f,%f)"%(self._x,self._y,self._r)
    def __repr__(self):
        return self.__str__()

class rectangle(Point):
    def __init__(self,x,y,w,h):
        Point.__init__(self,x,y)
        self._w=w
        self._h=h
    
    @property
    def gtype(self):
        return "gtRectangle"

    @property
    def w(self):
        return self._w
    @w.setter
    def w(self,v):
        self._w=v

    @property
    def h(self):
        return self._h
    @h.setter
    def h(self,v):
        self._h=v

    @property
    def Perimeter(self):
        return 2*self._w+2*self._h

    @property
    def area(self):
        return self._w*self._h
    def __str__(self):
        return "Rectangle(%f,%f,%f,%f)"%(self._x,self._y,self._w,self._h)

现在我想再加一个包,能够表示折线,且这个折线有几个节点并不固定。我只知道固定折线上点的个数的话(例如只有2个点),可以像下面这么写。核心大体就是def __init__(self,x0,y0,x1,y1):

同样的,折线固定只有三个点,那么就是def __init__(self,x0,y0,x1,y1,x2,y2):

但是我不知道不固定该怎么写,希望各位高手帮个忙

class BROKENLINE(Geometry):
    def __init__(self,x0,y0,x1,y1):
        Geometry.__init__(self)
        self._start=Point(x0,y0)
        self._end=Point(x1,y1)

    @property
    def gtype(self):
        return "gtBROKENLINE"

    @property
    def start(self):
        return Point(self._start.x,self._start.y)
    @start.setter
    def start(self,v):
        self._start.x=v.x
        self._start.y=v.y
    
    @property
    def end(self):
        return Point(self._end.x,self._end.y)
    @end.setter
    def end(self,v):
        self._end.x=v.x
        self._end.y=v.y
    
    @property
    def length(self):
        return math.sqrt((self.end.x-self.start.x)**2+(self.end.y-self.start.y)**2)

    def __str__(self):
        return "BROKENLINE(%f,%f,%f,%f)"%(self._start.x,self._start.y,self._end.x,self._end.y)  
    def __repr__(self):
        return self.__str__()
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • benbenli
    benbenli 2021-05-15 21:13
    已采纳

     

    def __init__(self,*args)

     

    args 时以各tuple,然后你再函数体里面可以检测元素个数和访问元素。

     

    点赞 评论

相关推荐