Python能否在类内部导入模块以实现类似嵌套函数的作用域效果?
问题解答
你原有代码报错的核心原因是Python类作用域和函数作用域的规则不同:类体执行时导入的math会成为类的属性(即Polygon.math),而类的方法并不会将类的命名空间作为外围作用域,因此方法内直接写math会找不到对应变量触发报错。
完全可以实现你要求的「不全局导入、不重复导入」需求,以下是两种常用实现方案:
方案1:最小改动适配原有写法
仅需要把方法内所有调用math的地方改为通过实例/类访问即可:
class Polygon: import math def __init__(self, edge, curcumradius): self._n = edge self._r = curcumradius @property def edge_length(self): self._edgelength = (2 * self._r) * self.math.sin(self.math.pi / self._n) return self._edgelength @property def apothem(self): self._apothem = self._r * self.math.cos(self.math.pi / self._n) return self._apothem
方案2:贴合嵌套函数写法,仅导入需要的对象
如果不需要整个math模块,仅导入用到的pi、sin、cos即可,写法更简洁,更接近你给出的嵌套函数示例效果:
class Polygon: from math import pi, sin, cos def __init__(self, edge, curcumradius): self._n = edge self._r = curcumradius @property def edge_length(self): return (2 * self._r) * self.sin(self.pi / self._n) @property def apothem(self): return self._r * self.cos(self.pi / self._n)
两种方案都不会把math相关的导入暴露到全局作用域,也不需要在每个属性方法里重复导入,完全符合需求。
内容的提问来源于stack exchange,提问作者Jishnu
相关产品推荐
相关产品推荐

