将属性分配给函数

时间:2014-06-27 16:49:04

标签: python python-2.7 attributes

这可能是一个非常初学的问题,但我对属性有疑问。 我有一个负责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文档中引用的函数属性?

谢谢,对不起,如果已经回答,我确实尝试搜索,但一直在运行非常具体的问题。

3 个答案:

答案 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和类来获得你想要的东西。即:

来源:zattr2.py

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