更好/更正的方式来访问来自类内部的静态信息

时间:2014-10-22 20:11:39

标签: python python-3.x

这是我的班级:

class node:
    node.maxNum = 10000
    node.maxCoord = 10000.0

    def __init__(self, num = 0, **coordsIn):

        if num > node.maxNum: raise nodeNumException
        self.num = num

        ##set default args##
        coordsDefault = {'X' : float('NaN'), 'Y' : float('NaN')}

        ##set coordinates to input##
        self.coords = coordsIn

        @property.setter
        def coords(self, **Coords):
            for Key in Coords:
                if Coords[Key] > maxCoord: raise nodeCoordException
            ##Set _coords to default, then update from coordsIn##
            self._coords = coordsDefault.update(Coords)
        @property
        def coords(self):
            return self._coords

创建实例时,会产生以下错误:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    File "C:\Projects\CANDE\mesh.py", line 7, in __init__
    if num > node.maxNum: raise nodeNumException
NameError: name 'maxNum' is not defined

我尝试过几种不同的方式访问我班级中的maxNummaxCoord变量,但我似乎无法弄清楚如何避免此错误。

有没有办法修复我的代码并采用相同的方法?

另外:有更好的方法吗?任何建议,将不胜感激。这是我的第一个主要的Python项目。

2 个答案:

答案 0 :(得分:3)

类变量在声明/定义时不需要类限定符。访问时只需要限定符

class node:
    maxNum = 10000
    maxCoord = 10000.0

    def __init__(self, num = 0, **coordsIn):

        if num > node.maxNum: raise nodeNumException
        self.num = num
        ........

您的代码中存在更多问题

  1. 定义setter时,需要一个属性对象。
  2. setter应该始终跟随getter,否则你会得到一个NameError。

答案 1 :(得分:2)

class node:
    maxNum = 10000
    maxCoord = 10000.0

同时使用要访问的节点将行更改为if Coords[Key] > node.maxCoord: raise nodeCoordException

不相关但您应该使用大写的类名:class Node