6

これはスタイル規則の質問です。

クラス定義のPEP8規則は、次のようになります。

class MyClass(object):
    def __init__(self, attri):
        self.attri = attri

したがって、データを取得して処理し、MyClassのインスタンスを作成するモジュールスコープの関数を作成するとします。

PEP8によると、関数定義には、次のような小文字のアンダースコアスタイル名を付ける必要があります。

def get_my_class(arg1, arg2, arg3):
    pass

しかし、私の傾向は、私がそのようなMyClassインスタンスについて話していることを明確にすることです

def get_MyClass(arg1, arg2, arg3):
    pass

この場合、my_classとMyClassが関連していることは自明に見えますが、それほど明白ではない場合もあります。たとえば、スプレッドシートからデータを取得していて、heading属性とdatalist属性の形式をとるSpreadsheetColumnクラスがあります。それでも、私がSpreadsheetColumnクラスのインスタンスについて話していることを知らなかった場合は、Excelシートに表示される可能性のあるセルの生の列について話していると思うかもしれません。

を使用するためにPEP8に違反することが合理的かどうか疑問に思いますget_MyClass。Pythonに慣れていないので、悪い命名規則の習慣を作りたくありません。

PEP8とStackOverflowを検索しましたが、問題に対処するものは見つかりませんでした。

4

2 に答える 2

11

classmethod関数の使用法によっては、関数をまたはに変換する方が適切な場合がありますstaticmethod。そうすれば、との関連classは明らかですが、命名規則に違反することはありません。

例えば:

class MyClass(object):
     def __init__(self,arg):
         self.arg = arg

     @classmethod
     def from_sum(cls,*args):
         return cls(sum(args))

inst = MyClass.from_sum(1,2,3,4)
print inst.arg  #10
于 2013-01-25T21:19:31.807 に答える
1

一歩後退しましょう。通常、これはまったく行いたくないので、命名規則は最も心配する必要はありません。

まず、通常、実際のクラスやタイプは関係ありません。これがダックタイピングのすべてです。インスタンスは必要ありませんSpreadsheetColumn。スプレッドシートの列として使用できるものが必要です。SpreadsheetColumnこれは、、サブクラス、プロキシクラス、またはテスト用のモッククラスのインスタンスである可能性があります。それが何であれ、列のように見えて機能する限り、気にする必要はありません。

JavaやC#のような静的言語でも、ファクトリ関数(またはオブジェクト)は通常、特定のクラスのインスタンスを作成せず、特定のインターフェイスを実装する任意のクラスのインスタンスを作成することに注意してください。Pythonでは、これは通常暗黙的です。(そうでない場合は、通常、PEAKやTwistedなどを使用しているため、プロトコルまたはインターフェイスのコーディングスタイルに従う必要があります。)

したがって、ファクトリ関数はget_column、ではなく、と呼ばれる必要がありget_SpreadsheetColumnます。

関数がファクトリというよりも「代替コンストラクタ」である場合、mgilsonの答えがその方法です。優れた標準ライブラリの例を参照chain()chain.from_iterable()てください。itertools

ただし、これは標準ライブラリやPyPIで人気のあるモジュールのほとんどなどではあまり一般的ではないことに注意してください。そして、正当な理由があります。*args通常、デフォルト値のパラメーター、キーワードパラメーター、または最悪の場合はとを使用して、単一のコンストラクターを使用できます**kwargs。これにより、APIが人間の読者にとって混乱しすぎたり、コード化するにはあいまいすぎたりする場合は、代替コンストラクターが必要になります。そうでなければ、あなたはしません。

場合によっては、具象型のオブジェクトを作成するファクトリが本当に必要であり、その具象型は、呼び出し元が知る必要のあるインターフェースの一部です。上で述べたように、これは静的言語でも非常にまれであり、Pythonではさらにまれですが、実際に発生します。そして、あなたは本当にあなたの元の質問への答えを必要とします。

その場合、私は関数にまたはのような醜くて珍しい名前を付けると思います。私のコードを読んでいる人は、コードの残りの部分を理解するために、なぜ私がではなく明示的に取得しているのかを理解する必要があるため、すぐに突き出す必要があります。get_MyClassget_MyClass_instanceMyClassthing

于 2013-01-26T00:35:25.133 に答える