1

Im trying to create a class with some formatting options. But i can't figure out how to do it properly...

The code produced the following error:

AttributeError: 'NoneType' object has no attribute 'valuesonly'

class Testings(object):

    def format_as_values_only(self,somedata):
        buildstring=somedata.values()
        return buildstring

    def format_as_keys_only(self):
        pass

    def format_as_numbers(self):
        pass


    def get_data_method(self):
        self.data= {'2_testkey':'2_testvalue',"2_testkey2":"2_testvalue2"}

        @property
        def valuesonly(self):
            return format_as_values_only(self.data)

test=Testings()
print test.get_data_method().valuesonly 

The important thing for me is to be able to get the formatters like: class.method.formatter or so...

Thanks a lot for any hints!

4

2 に答える 2

2

get_data_methodには戻り値がないため、 の結果はtest.get_data_method()ですNone。そのため、その例外が発生しています。

本当にのようなことをしたい場合は、 でプロパティをtest.get_data_method().valuesonly定義してreturnを持っているか、定義したいプロパティを持つ新しいオブジェクトを返してください。valuesonlyTestingsget_data_methodselfget_data_method

于 2012-11-04T18:02:01.340 に答える
1

このように物事を行うことはできません。メソッドは、クラス ブロック内で直接定義された単なる関数です。関数は別の関数内にあるため、メソッドではありません。propertyデコレーターは、クラス ブロック以外では役に立ちません。

しかし、より基本的には、変数の割り当てなどと同じように、関数定義はローカル名を作成するだけです。関数内からは戻り値以外はアクセスできないため、関数は関数の外部からはまったくvaluesonlyアクセスできません。あなたがしたことは、次のものと同じです。get_data_method

def get_data_method(self):
    a = 2

. . . そしてa、関数の外からローカル変数にアクセスできることを期待しています。うまくいきません。を呼び出すと、何も返さないためget_data_method()、値が得られます。その後の結果で行うことは、同じ None 値で操作するだけです。Noneget_data_methodget_data_method()

説明した構文を使用してアクセスしたい場合は、 のget_data_methodようなプロパティを持つオブジェクトを返す必要がありますvaluesonlyvaluesonlyつまり、プロパティを提供する別のクラスを作成し、get_data_methodそのクラスのインスタンスを返すようにします。大まかな概要 (未テスト):

class DataMethodGetter(object):
    def __init__(self, parent):
        self.parent = parent

    @property
    def valuesonly(self):
        return format_as_values_only(self.parent.data)

class Testings(object):
    # rest of class def here
    def get_data_method(self):
        self.data = {'blah': 'blah'}
        return DataMethodGetter(self)

ただし、なぜこれを行う必要があるかを考える必要があります。valuesonlyオブジェクトを直接呼び出すように設定するTestingか、 にフラグを渡して のget_data_methodように設定する方が簡単でしょうget_data_method(valuesonly=True)

于 2012-11-04T18:04:25.633 に答える