6

最近、Ubuntu Server 管理用に Python 2.6 を使い始めましたが、冗長性に関して 2 つの小さな問題があります。

最初のものはインポートです: それらはすべて次のように見えます

クラスからクラスをインポート

from class import Class

2 つ目は__init__メソッドです。

__init__(self,arg1,...,argn):
    self.arg1 = arg1
    ...
    self.argn = argn

これらの重複を避ける方法はありますか?

4

3 に答える 3

8

2つ目は冗長性ではなく、インスタンス属性を設定することです。次のようにすることもできます。

class Foo:

   def __init__(self, **kwargs):
       for name, value in kwargs.items():
          setattr(self, name, value)

ただし、次のようにFooを呼び出す必要があります。

   Foo(arg1=1, arg2=2, arg3=3)

また、インポートの構文が不適切なようです。する必要がありますfrom Class import Class。これは、各クラスを別々のファイル(モジュール)に保存しているように見えるため、冗長に見えます。これはまったく冗長です。PythonはJavaではありません。通常、1つのモジュールでより多くのオブジェクトを保持する必要があります。そのモジュール自体がオブジェクトであることに注意してください。また、モジュールには適切な名前を付ける必要があります。デフォルトのコードスタイルガイドでは、モジュールはすべて小文字で、特別な文字は使用しないようになっています。のようにreまたはurllib例えば。

于 2011-01-27T09:37:17.137 に答える
2
from module import Class

クラス名がそれを含むモジュールの名前と異なることはよくあることです。モジュールごとに同じ名前のクラスが 1 つしかない場合は、そのクラスを階層内の 1 レベル上に移動することを検討してください。

def __init__(self, a, b, c):
  self.a = a
  self.b = b
  self.c = c

これはちょっと面倒に思えることがよくありますが、別の方法と比較して、読みやすさの点で実際には悪くありません。ただし、init で他の作業を行わずに属性として割り当てるだけのパラメーターが多数ある場合は、そのようなボイラープレートを生成できる名前付きタプルなどから継承することを検討してください。(特に Namedtuple には他の影響があり、適切な場合もあります。このタイプのボイラープレートを処理できる基本クラスの例として使用しています。)

于 2011-01-27T10:08:44.683 に答える
1

argsのバージョン:

class Foo:

   def __init__(self, *args):
       for index,arg in enumerate(args):
          setattr(self, 'arg%s'%index, arg)


Foo(1,2,3)
>>> Foo.arg0
1
于 2011-01-27T09:41:58.340 に答える