1

テキスト ファイルを解析し、テキスト ファイルの行ごとにオブジェクトを作成しています。各行を解析するときに、オブジェクト自体と一緒に呼び出し元のコードに返すタイム スタンプを作成します。

オブジェクト自体にタイムスタンプを保存し、オブジェクトを作成した後にアクセスすることで実現していることに気付き、現在行っていますが、オブジェクトを作成するときに自分自身とタイムスタンプを返すことができれば、より便利だと思います。

これを行う方法について提案がありますが、これが問題ないと見なされるかどうか、そうでない場合はどうすれば適切に行うことができるかを知りたいです。

class Foo():
    def __init__(self, infile):
        self.time_stamp = foobar(infile)
        self.line = barfoo(infile)

        return (self, self.time_stamp)

(obj, time_stamp) = Foo()

乾杯。

4

1 に答える 1

4

から以外は何も返すNone__init__ことはできません:

コンストラクターに対する特別な制約として、値が返されない場合があります。これを行うと、実行時に TypeError が発生します。

ファクトリ関数を使用します。

def create_foo(infile):
    foo = Foo(infile)
    return foo, foo.time_stamp

...

obj, ts = create_foo(a_file)

または静的メソッド

class Foo(object):
    ...
    @staticmethod:
    def create(infile):
        obj = Foo(infile)

        return obj, obj.time_stamp

...

obj, ts = Foo.create(a_file)

または、サブクラスで適切に動作する必要がある場合は、クラス メソッド

class Foo(object):
    ...
    @classmethod
    def create(cls, infile):
        obj = cls(infile)

        return obj, obj.time_stamp

...

obj, ts = Foo.create(a_file)

 

もちろん、これが最も簡単な方法です。

class Foo(object):
    def __init__(self, infile):
        self.time_stamp = ...


obj = Foo(a_file)
ts = obj.time_stamp

この余分な行を取り除くことが、工場を設計する正当な理由になるとは思いません。

于 2013-04-08T12:01:57.860 に答える