无法使属性在嵌套方法中起作用

时间:2012-11-04 17:56:03

标签: python

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

代码产生以下错误:

  

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 ...

非常感谢任何提示!

2 个答案:

答案 0 :(得分:2)

get_data_method没有返回值,因此test.get_data_method()的结果为None。这就是你得到这个例外的原因。

如果确实想要执行test.get_data_method().valuesonly之类的操作,请在valuesonly上定义Testings属性,并get_data_method返回{{} 1}},或让self返回一些具有您想要定义的属性的新对象。

答案 1 :(得分:1)

你不能这样做。方法只是直接在类块中定义的函数。你的函数在另一个函数里面,所以它不是一个方法。除了在类块中,property装饰器是无用的。

但是,从根本上说,函数定义只是创建本地名称,与变量赋值或其他任何东西相同。您的valuesonly函数无法从get_data_method函数外部全部访问,因为除了返回值之外,函数中的任何内容都不可访问。你所做的与以下情况完全不同:

def get_data_method(self):
    a = 2

。 。 。然后期望能够从函数外部访问局部变量a。它不会起作用。当您致电get_data_method()时,您会获得值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)

但是,您应该考虑为什么要这样做。将其设置为直接在valuesonly对象上调用Testing或将标记传递给get_data_method,执行类似get_data_method(valuesonly=True)的操作可能会更简单。