0

次に例を示します。

# class.py
class MyString:
    def __init__(self, str):
        self.str = str
    def __div__(self, sep):
        return self.str.split(sep)

>>> m = MyString('abcdabcdabcd')
>>> print m / 'b'
['a', 'cda', 'cda', 'cd']

この__init__メソッドは 2 つのパラメーターを取ります。最初selfの はインスタンス オブジェクト自体でstr、2 番目のパラメーターは呼び出しによって渡されたパラメーターです。__init__クラスのインスタンスに値を取得する唯一の方法を使用していますか?

または、 method を宣言しないと、 の__init__ような式が機能m = MyString('abcdabcdabcd')しなくなりますか?

4

4 に答える 4

0

@Ignacio は初期化部分を取得しました。それが唯一の方法であるという質問については、いいえ、他の関数を使用してクラスのインスタンスに値を取得できます。あなたの例では、

def set_string(self, new_string):
    self.str = new_string()

または、インスタンスに値を直接割り当てることもできます。

>>> m = MyString('abcdabcdabcd')
>>> m.str = "cbacbacba"
于 2013-07-23T02:48:00.270 に答える
0

デフォルトでは、次のようにパラメータなしでオブジェクトを作成すると、

a = Class()

次に、__init__パラメータのないメソッドが呼び出されます。

methodを使用していない場合は__init__、次のようにパラメーターなしでインスタンスを作成する必要があります

class MyString:
    def __div__(self, sep):
        return self.str.split(sep)
m = MyString()

しかし、インスタンスにパラメーターを追加したい場合は、プログラムのようにinitをパラメーターと共に使用する必要があります。

次のようにクラス変数を追加できます

class MyString:
    str = ''
    def __init__(self,str):
        MyString.str = str
    def __div__(self, sep):
        return self.str.split(sep)
m = MyString('aSAA')
print(MyString.str)
#print(m.str)
['a', 'cda', 'cda', 'cd']

しかし、クラス変数は静的であり、オブジェクトに固有ではないクラス自体のプロパティです。

于 2013-07-23T03:00:00.710 に答える
0

イニシャライザ( Class.__init__()) は、コンストラクタ( )に渡される引数を取得するために常に使用されます。これがないと、コンストラクターは期待どおりに機能しません。Class()

于 2013-07-23T02:39:37.500 に答える
0

簡単な答え: 推奨される方法は、__init__メソッドを新しいインスタンスの「コンストラクター」として使用することです。このメソッドを提供しない場合は、引数なしでクラス名を呼び出すことによってのみ (通常の方法で) クラスのインスタンスを作成できます。

より長い答え:

を使用する最も簡単な代替方法__init__は、インスタンスの作成後に属性を設定することです。

class Foo(object): pass
x = Foo()
x.bar = 3

クラス内のAstaticmethodを使用して、このようなことを行い、インスタンスを返すことができます。たとえば、シングルトン パターンを実装する場合です。些細な例:

class Foo(object):
  @staticmethod
  def newinstance():  # no self here
    x = Foo()
    x.bar = 3
    return x

y = Foo.newinstance()
print y.bar  # prints 3

実際にメソッドを提供せずにオブジェクトを初期化するより難解な__init__方法は、メタクラスを使用して通常とは異なる方法でインスタンスを作成することです。しかし、メタクラスが実際のアプリケーションで必要になることはめったにありません。

于 2013-07-23T03:11:50.520 に答える