1

我试图创建一个带有一些格式选项的类。但我无法弄清楚如何正确地做到这一点......

该代码产生了以下错误:

AttributeError:“NoneType”对象没有属性“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 

对我来说重要的是能够获得像这样的格式化程序:class.method.formatter 左右......

非常感谢任何提示!

4

2 回答 2

2

get_data_method没有返回值,所以结果test.get_data_method()None. 这就是为什么你得到那个例外。

如果你真的想做类似的事情test.get_data_method().valuesonly,要么在 上定义valuesonly属性Testings,然后get_data_method返回self,要么get_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(),您会得到 value None,因为get_data_method不会返回任何内容。您随后对结果所做的任何事情get_data_method()都只是对相同的 None 值进行操作。

如果您想使用您描述的语法访问事物,您将需要get_data_method返回一个具有类似valuesonly. 换句话说,编写另一个提供valuesonly属性的类,并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)

但是,您应该考虑为什么要这样做。将其设置为直接调用对象可能更简单valuesonlyTesting或者将标志传递给get_data_method,执行类似get_data_method(valuesonly=True).

于 2012-11-04T18:04:25.633 回答