Skip to main content
 首页 » 编程设计

python之是否允许在 init 方法中使用方法

2025年05月04日13jirigala

我刚开始学习 python3 中的 OOP,今天我们开设了这个小类(class)。

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 

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

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) 

你能做到吗?
如果是这样,这是一种好的做法吗?

如果不是,仅使用侧面获得周长的最佳方法是什么?

请您参考如下方法:

__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) 

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

class Square(): 
  def __init__(self, side): 
    self.side = side; 
 
  @property 
  def perimeter(self): 
    return self.side * 4 
 
x = Square(10) 
print(x.perimeter) 
>>> 40 

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