2013-10-26 42 views
-1

我是Python属性的新手。我想要使​​用它们来创建一个“setter”,以确保在设置相应属性时属性值在其允许的范围内。我在类中访问python属性

典型用法示例发现看起来像这样:

class C(object): 
    def __init__(self): 
     self.__x = None 
    def getx(self): 
     print "+++ getx()" 
     return self.__x 
    def setx(self, v): 
     if (v > 0): 
      print "+++ setx({0})".format(v) 
      self.__x = v 
    def delx(self): 
     print "+++ delx()" 
     del self.__x 
    x = property(getx, setx, delx, "Me property 'x'.") 

在这个简单的例子中,设定器“SETX”确保只有正值可以被分配给该属性自.__ X。到现在为止还挺好。但是,在查看这段代码时,我开始想知道是否可以使用类中的属性。例如,我不知道如果我能有下面的构造:

def __init__(self): 
    self.x = None 

,以获得从构造方法中权称为setter方法,以确保属性自.__ X被设置为一个有效的值。再进一步,我想知道我是否可以从班上的其他任何人那里做同样的事情(除了吸气器和制动器本身之外)。如果是这样,这是不是很好的编程习惯?如果不是,还有什么替代方案?我对此很困惑。

谢谢!

+0

从类内部或外部访问属性没有什么区别(并且在python解释器中尝试这样做比写这个问题花费的时间少)。如果你想知道访问属性或实际属性是否更好,这可能取决于具体的用例 - 在你的例子中,用'self.x = None'替换'self .__ x = None'是没有意义的因为setter只将值设置为> 0和'None> 0 == False'。 – l4mpi

+0

感谢您的回复。在提交问题之前,我确实尝试了这一点,并且看到它的工作原理,但是由于我找不到这样的代码示例,所以我不确定这是否是好的做法和/或是否有任何我不知道的捕获的。谢谢! –

回答

0

我开始想知道我是否可以使用类 本身的属性。

是的,你可以使用的setter /吸气剂构造

def __init__(self): 
    self.x = None 

这是罚款(尽管在这种特定情况下它会失败,因为None > 0 == False,您可能希望通过报告的条件登录或引发异常)。可能有不希望在构造函数中使用访问器的原因。例如,如果它们需要昂贵的操作,而这些操作在构造函数中执行时没有用处(例如延迟加载,如延迟实际初始化直到真正需要)。