1

抽象メソッドのみを持つ Python でクラスを作成し、クラスにすべてのメソッドを実装しましたBasicMR(すべてのコードがBasicMRスニペットに存在するわけではありませんが、メソッドtest_stationary()は内部で呼び出されますself.generate_positions())。

class Strategy(object):
    __metaclass__=ABCMeta

    @abstractmethod
    def generate_positions(self):
        raise NotImplementedError("You must implement generatePositions()!")

    @abstractmethod
    def get_positions(self):
        raise NotImplementedError("You must implement getPositions()!")


class BasicMR(Strategy):
    def __init__(self, security, lookback=30):
        self.__securities = []
        self.__securities = security   # it could be either one security or a list of security objects
        self.__positions = self.generate_positions()

    def test_stationary(self, lb=30):
        if not isinstance(self.__securities, list):
            securities = [self.__securities]
        else:
            securities = self.__securities
        prices = [one_stock.get_prices(lb) for one_stock in securities]  # list comprehension
        results = [ts.adfuller(price_series, regression="c", autolag='AIC') for price_series in prices]
        simple_results = [BasicMR.simplify_adf_results(result[1], result[0], result[4]) for result in results]
        if len(simple_results) == 1:
            return simple_results[0]
        else:
            return simple_results

    def generate_positions(self, long_only=False, time_frame=20, max_holding_period = 20):
        result = []
        names = []
        # HERE IS SOME CODE
        return [names, result]

    def get_positions(self):
        return self.__positions

ただし、 のインスタンスを作成するとBasicMR()、次の行でエラーが発生します。

if not isinstance(self.__securities, list):

エラー:

AttributeError: 'int' object has no attribute '_BasicMR__securities'

どういうわけか、私の BasicMR クラスのインスタンスが type として認識されてしまいint、そのエラーをどうすればよいかわかりません。

4

2 に答える 2

2

test_stationary あなたはクラスを呼び出しています:

>>> BasicMR.test_stationary(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 20, in test_stationary
AttributeError: 'int' object has no attribute '_BasicMR__securities'

メソッドがバインドされていないため、これ42は引数として渡されます。self

ただし、 andの具体的な実装を提供していないため、クラスのインスタンスを作成できません。generate_positionsget_positions

>>> BasicMR([])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 17, in __init__
  File "<string>", line 6, in generate_positions
NotImplementedError: You must implement generatePositions()!
于 2015-02-02T12:11:05.033 に答える
0

私はついに問題の原因を見つけました。メソッドgenerate_positions()では、インスタンスのメソッドをクラスメソッドのように呼び出しました。これは、書く代わりに

stationarity_checked_securities = self.test_stationary(time_frame)

私が持っていた:

stationarity_checked_securities = BasicMR.test_stationary(time_frame)

そして、は次のtest_stationary()ように定義されました。

def test_stationary(self, lb=30):
    #some code here

つまり、クラスメソッドではありませんが、そうであるかのように呼び出しました。最終的に、私のバグは非常に単純なもののように見えましたが、エラー テキストに混乱しました (私は Python を初めて使用するので、クラス インスタンスがint objectエラーで " " と呼ばれる理由がわかりませんでした。

于 2015-02-02T15:32:59.833 に答える