0

Python(ここでは2について話しますが、3についても知りたいと思います)では、使用可能にしたいすべてのインスタンス変数(メンバーフィールド)のリストを事前に定義する方法があります。つまり、1つを使用するとエラーになります。どこかで定義していませんか?

何かのようなもの

class MyClass(object):
    var somefield
    def __init__ (self):
        self.somefield = 4
        self.banana = 25      # error!

Java、C ++、PHPなどで行うのと少し似ています

編集:

このようなことをしたかったのは、最初に設定されていない変数を使用することを早い段階で見つけるためでした。リンターは実際には余分な配管なしでこれらのエラーを拾うようですので、おそらく私の質問は議論の余地があります...

4

2 に答える 2

5

なぜそうなのか、できます。

class MyClass(object):
    __slots__ = ['somefield']
    def __init__ (self):
        self.somefield = 4
        self.banana = 25      # error!

ただし、注意点に注意してください。

于 2013-02-07T15:11:29.457 に答える
0

上記の回答を使用できますが、より「pythonic」なアプローチについては、(code.activestate.comへのリンク)にリストされている方法を試してください。

将来の参考のために、そして私がウェブサイトにリンクする方法を理解することができるまで、ここにコードがあります:

def frozen(set):
    """Raise an error when trying to set an undeclared name, or when calling
       from a method other than Frozen.__init__ or the __init__ method of
       a class derived from Frozen"""
    def set_attr(self,name,value):
        import sys
        if hasattr(self,name):                                  #If attribute already exists, simply set it
            set(self,name,value)
            return
        elif sys._getframe(1).f_code.co_name is '__init__':     #Allow __setattr__ calls in __init__ calls of proper object types
            for k,v in sys._getframe(1).f_locals.items():
                if k=="self" and isinstance(v, self.__class__):
                    set(self,name,value)
                    return
        raise AttributeError("You cannot add attributes to %s" % self)
    return set_attr
于 2013-02-07T15:20:19.353 に答える