4

Python では、クラス全体で属性を宣言できます。例えば ​​:

class Foo:
def __init__(self):
    self.a = 0

def foo(self):
    self.b = 0

多くの属性を持つ大きなクラスがある場合、クラス内のすべての属性を取得するのは困難です。

次のコード (a) と次の次のコード (b) のどちらがよいでしょうか。

a)ここでは、すべての属性を見つけるのは困難です:

class Foo:
    def __init__(self):
        foo_1()
        foo_2()

    def foo_1(self):
        self.a = 0
        self.b = 0

    def foo_2(self):
        self.c = 0

b)ここでは、すべての属性を簡単に見つけることができますが、美しいですか?

class Foo:
    def __init__(self):
        (self.a, self.b) = foo_1()
        self.c = foo_2()

    def foo_1(self):
        a = 0
        b = 0
        return (a, b)

    def foo_2(self):
        c = 0
        return c

一言で言えば、クラスで属性を宣言するための規則は何ですか?

編集:

もちろん、これは単純な例であり、ここでコードを改善する必要はありません。_init_ ()で呼び出される「小さなメソッド」(コードを分割し、読みやすくするため) が多数ある複雑なクラスを想像してみてください。

4

4 に答える 4

5

理想的には、コンストラクターはメソッドを呼び出さないでください。コンストラクター は実際の作業を行わないようにする必要があります

属性の数が不均衡に増えた場合は、クラスをリファクタリングする必要があります。たとえば、Extract Classを使用してクラスを複数のクラスに分割し、単一責任の原則を尊重します。

于 2010-12-30T11:06:06.413 に答える
4

これの何が問題なのですか:

class Foo:
    def __init__(self):
        self.a = 0
        self.b = 1
        self.c = 2

またはabcが何らかの形で関連している場合は、それらを 1 行で宣言できます。

class Foo:
    def __init__(self):
        self.a, self.b, self.c = 0, 1, 2

またはabcが何らかの形関連しており、それらを同じ不変値に初期化する場合は、それらを 1 つの代入で宣言できます。

class Foo:
    def __init__(self):
        self.a = self.b = self.c = 0
于 2010-12-30T10:46:53.613 に答える
0

まず、ここではクラス属性ではなく、インスタンス属性について説明します。そのための私の慣例は、コンストラクター内のそれらすべてを、別のメソッドで初期化された場合はNoneの値で行うことです。そうすれば、私はいつでも何を期待できるかを知ることができます。必須ではありませんが、宣言するようなものです。

例えば:

class Foo(object):
    def __init__(self, a=None, b=None, c=None):
        self.a = a
        self.b = b
        self.c = c

ええと、私はキーワード引数としてイニシエーターを作るのも好きです、それはそれをより柔軟にします。その方法でデフォルトを簡単にオーバーライドすることもできます。

于 2010-12-30T11:01:09.797 に答える
0

Python では、クラス全体で属性を宣言できます。

正しい。

多くの属性を持つ大きなクラスがある場合、クラス内のすべての属性を取得するのは困難です。

いいえ。dir(object)またはobj.__dict__そこで役立ちます。さらに、なぜすべての属性を取得する必要があるのでしょうか?

ここでは、すべての属性を見つけるのは困難です

優れたエディター/IDE は、定義を見つけるのに役立ちます。これには WingIDE を使用していますが、これはかなり優れています。

ここでは、すべての属性を簡単に見つけることができますが、それは美しいですか?

この特定のコードはそうではないかもしれませんが、クラス内またはクラス内ですべてのパブリック属性を宣言することは非常に一般的です(ただし、これを行うときはJabberwock__init__に注意してください)。そうすれば、それらが利用可能であることがわかります。これは良いことです。

于 2010-12-30T11:21:01.973 に答える