你是否可以在init方法中使用方法?

1 python object python-3.x

我刚刚开始在python3中学习OOP,今天我们就开始学习这个小班.

class Square:

    def __init__(self, side):
        self.side = side

    def show_perimeter(self):
        print(self.side * 4)

test_square = Square(10)
test_square.show_perimeter()
>> 40
Run Code Online (Sandbox Code Playgroud)

现在我在想是否有可能在创建对象时获得周长的值,例如......

class Square:

    def __init__(self, side):
        self.side = side
        self.permiter = get_perimeter(self)

    def get_perimeter(self):
        return self.side * 4

test_square = Square(10)
print(test_square.perimeter)
Run Code Online (Sandbox Code Playgroud)

这是你能做的吗?
如果是这样,这是一个好习惯吗?

如果没有,那么通过使用侧面获得周边的最佳方法是什么?

gah*_*ooa 6

除了__init__作为对象构造的一部分自动调用(__new__创建对象并__init__初始化它)之外,该方法没有什么特别之处.因此,您可以在其中做任何您需要做的事情.但是,您需要确保不会无意中执行会对部分初始化对象执行操作的操作.下面的使用@property可以解决大多数这些边缘情况.

这里唯一的区别是它是更好的形式,self.method()而不是method(self)在大多数情况下.

class Square:

    def __init__(self, side):
        self.side = side
        self.permiter = self.get_perimeter()

    def get_perimeter(self):
        return self.side * 4

test_square = Square(10)
print(test_square.perimeter)
Run Code Online (Sandbox Code Playgroud)

但是,我想指出在这种情况下属性可能会更好:

class Square():
  def __init__(self, side):
    self.side = side;

  @property
  def perimeter(self):
    return self.side * 4

x = Square(10)
print(x.perimeter)
>>> 40
Run Code Online (Sandbox Code Playgroud)

在这种情况下,@property装饰器将perimeter方法转换为一个属性,该属性可以像它是另一个属性一样被访问,但它是在被要求时计算的.