我试图创建一个带有一些格式选项的类。但我无法弄清楚如何正确地做到这一点......
代码产生以下错误:
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 ...
非常感谢任何提示!
答案 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)
的操作可能会更简单。