在使用 Python 进行面向对象编程时,我们经常会定义类来封装数据和方法。需要注意的是,Python 不能在函数内部定义另一个函数。
示例场景
假设我们要编写段代码,计算不同形状的图形的面积和周长。我们使用类来表示不同的图形,例如圆形 (Circle)、正方形 (Square) 和长方形 (Rectangle)。每个图形类都有计算面积和周长的方法。
问题还原
初学者在编写这类程序时,容易犯一个错误,就是将 area()
和 perimeter()
等方法定义在 operation_perform()
等其他方法内部。例如:
import math
class Shape:
def operation_perform(self):
# ... 获取用户输入 ...
if m == '1':
def area(self, a, b = 0): # 错误:在方法内部定义方法
# ... 计算面积 ...
elif m == '2':
def perimeter(self, a, b = 0): # 错误:在方法内部定义方法
# ... 计算周长 ...
# ...
这样的代码会导致程序无法正常运行。因为在 Python 中,不能在函数内部定义另一个函数。当你尝试调用 area()
或 perimeter()
方法时,Python 解释器会报错,因为它找不到这些方法。
正确的实现方式
我们需要将 area()
和 perimeter()
方法定义在类的顶层,与 operation_perform()
方法处于同一级别。下面是修改后的代码:
import math
class Shape:
def area(self):
pass # 子类需要实现具体计算逻辑
def perimeter(self):
pass # 子类需要实现具体计算逻辑
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
def perimeter(self):
return 2 * math.pi * self.radius
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side ** 2
def perimeter(self):
return 4 * self.side
class Rectangle(Shape):
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
def perimeter(self):
return 2 * (self.length + self.width)
# 创建图形对象并调用方法
circle = Circle(5)
print('圆形面积:', circle.area())
print('圆形周长:', circle.perimeter())
square = Square(4)
print('正方形面积:', square.area())
print('正方形周长:', square.perimeter())
rectangle = Rectangle(4, 2)
print('长方形面积:', rectangle.area())
print('长方形周长:', rectangle.perimeter())
总结
在 Python 类中定义方法时,要确保将方法定义在类的顶层,而不是嵌套在其他方法内部。