如何有效地设计包含相关成员变量的类?

off*_*555 5 python oop

假设我想要一个名为Num的类,它包含一个数字,一半和它的正方形.

我应该能够修改三个变量中的任何一个,它将影响它的所有相关成员变量.我应该能够使用三个值中的任何一个来实例化该类.

设计这个类的最佳方法是什么,以便可以轻松修改并确保我不会留下什么东西?

我应该存储所有三个号码还是只存储主号码?

例如,这就是我将如何在python中使用我的类:

num = Num(5)
print num.n, num.half, num.square
Run Code Online (Sandbox Code Playgroud)

它应该打印5,2.5和25

这很简单,但我也想用它的一半初始化.

num = Num(half=2.5)
print num.n, num.half, num.square
Run Code Online (Sandbox Code Playgroud)

它还应该打印5,2.5和25

如何让init函数知道它是一半?

我也想修改任何数字,它将改变所有相关的数字!例如:

num.square = 100
print num.n, num.half, num.square
Run Code Online (Sandbox Code Playgroud)

它应该打印10,5和100

任何有关如何设计课程的建议都将受到赞赏.

wwi*_*wii 4

与 @Daniel 相同的解决方案 -扩展、无 lambda、Python 3.3:

class Num:
#class Num(object): for Python 2.
    def __init__(self, n = None, half = None, square = None):
        if n is not None:
            self.n = n
        elif half is not None:
            self.half = half
        elif square is not None:
            self.square = square
        else:
            self.n = 0

    @property
    def n(self):
        return self.__n
    @n.setter
    def n(self, n):
        self.__n = n
    @property
    def half(self):
        return self.n / 2.0
    @half.setter
    def half(self, n):
        self.n = n * 2
    @property
    def square(self):
        return self.n ** 2
    @square.setter
    def square(self, n):
        self.n = n ** .5

>>> five = Num(n=5)
>>> five.half, five.n, five.square, five._Num__n
(2.5, 5, 25, 5)
>>>
Run Code Online (Sandbox Code Playgroud)

  • @off99555:注意 `self.n / 2` 会导致 Python 2 和 3 产生不同的值。 (2认同)