这可能是一个非常初学的问题,但我对属性有疑问。 我有一个负责Google Docs API操作的模块,其中包含用于检索信息的功能。我希望能够将这些函数中的某些变量称为属性。 这是一个例子:
Gdocs.py
def getRows():
rows = #action for getting rows
rowsText = #action for converting to text
General.py
import Gdocs
text = Gdocs.getRows.rowstext
我知道传递变量的基本效果可以通过返回值来实现,但我想尽可能将它们称为属性。简单地说,我的问题是,如何创建一个我可以在另一个.py文档中引用的函数属性?
谢谢,对不起,如果已经回答,我确实尝试搜索,但一直在运行非常具体的问题。
答案 0 :(得分:0)
虽然我理解你所说的关于不希望每个功能的课程......
当你有一个类时,可以将@property装饰器应用于函数。 这样可以让您有效地创建展示行为但可以像属性一样调用的函数。在下文中,如果要根据输入列表生成方块列表,可以创建一个名为create_list_of_squares()的类似动词的函数。但在这种情况下,如果你真的想让API保持简单并抽象出方法背后的机制,并且只是让用户能够访问属性' square',你就可以使用属性装饰器,就像这样。
class SquareList(list):
@property
def squares(self):
return [x ** 2 for x in self]
s = SquareList([1, 2, 3, 4])
print s.squares
将产生:
[1, 4, 9, 16]
答案 1 :(得分:0)
听起来好像要返回由多个部分组成的结果。不要为此使用函数属性,返回可以通过属性寻址的 new 对象。这也使它成为线程安全的,因为函数属性与函数对象本身在同一范围内:作为全局。
标准库有一个有用的类工厂函数,只有这样的返回值collections.namedtuple()
:
from collections import namedtuple
Point = namedtuple('Point', 'x y')
def calculate_coordinates(foo, bar, baz):
return Point(42, 81)
返回值是一个元组子类,因此它可以像元组一样处理(带索引),可以解压缩为单独的值,也可以使用属性:
result = calculate_coordinates(spam, ham, eggs)
print result.x, result.y
或
res_x, res_y = calculate_coordinates(spam, ham, eggs)
所有工作。
答案 2 :(得分:0)
这有点奇怪,但你可以使用staticmethod
和类来获得你想要的东西。即:
class getRows(object):
@staticmethod
def rows(arg):
return [arg, arg]
@staticmethod
def rowsText(arg):
return repr(arg)
>>> import zattr2
>>> zattr2.getRows.rowsText('beer')
"'beer'"
请参阅:https://docs.python.org/2/library/functions.html#staticmethod