代码之家  ›  专栏  ›  技术社区  ›  Seth Johnson

何时使用“属性”内置:辅助函数和生成器

  •  9
  • Seth Johnson  · 技术社区  · 15 年前

    我最近发现了蟒蛇的 property built-in

    财产 A 有财产 _x 要限制其允许值;i、 例如,它将取代 getX() setX() 构造一个可以用C++编写。

    class Vertex(object):
        def __init__(self):
            self.x = 0.0
            self.y = 1.0
    
    class Polygon(object):
        def __init__(self, list_of_vertices):
            self.vertices = list_of_vertices
        def get_vertex_positions(self):
            return zip( *( (v.x,v.y) for v in self.vertices ) )
    

    是否可以添加

        vertex_positions = property( get_vertex_positions )
    

    ?

    让发电机看起来像是一个财产,这样可以吗?想象一下,如果代码中的更改意味着我们不再存储 Polygon.vertices Polygon ?

        @property
        def vertices(self):
            for v in self._new_v_thing:
                yield v.calculate_equivalent_vertex()
    
    2 回复  |  直到 15 年前
        1
  •  16
  •   Mike Graham    15 年前
    • 当您有一个普通属性,并且获取和/或设置它对类的用户有意义时,直接公开该属性。在某些语言中,公共成员被诅咒的一个重要原因是,如果您以后需要做更复杂的事情,那么您需要对API进行更改;在Python中,您可以定义一个属性。

    • 如果您使用的是应该抽象为属性访问的内容,请使用属性。如果您想使外部状态(您的绘图、网站或其他内容)意识到更改,或者如果您正在包装一些直接使用成员的库,那么可以使用属性。

    • 如果某个东西不是attribute-y,就不要把它当作属性。创建一个方法没有坏处,而且它也有好处:它的作用更明显,如果需要,可以传递一些绑定的方法,也可以添加关键字参数而不需要修改API。

      很难想象我会使用生成函数作为属性的情况。拥有一个行为完全相似的普通属性的唯一方法需要相当多的复杂性,因此这种情况不会让人想起属性访问。

    • 你指出你可以用 property 用于限制对某些内部属性的访问 _x . 这可能是真的,但请记住

      • 如果你打算做一些事情,比如为了安全起见对输入进行清理或者做一些重要的事情, . 当遇到这样的事情时,你不想觉得代码只是起作用,因为那样你就会遇到不起作用的代码。

      • 有时人们使用 财产

      • 财产 不是关键字;这是一个普通的名字,你可以重新绑定。这有点像 有趣的是 财产 它不是一个语法或任何东西:它是一个普通的类,您可以在纯Python中自己实现。它使用了使方法在Python中工作的相同机制 descriptors .

      • 你描述什么 财产 财产 take只是普通函数,实际上根本不需要在类中定义; 财产 会过去的 self another special thing 有点像属性,它改变了在查找属性时发生的事情。

        2
  •  3
  •   Olivier Verdier    15 年前

    它不接受任何论点

    因此,您必须确保要转换为属性的函数永远不会被重构为具有额外默认参数的函数。