用户定义函数中的python前导和尾随下划线

时间:2016-09-22 10:58:29

标签: python

我如何使用rt功能,因为我理解领先&尾部下划线__and__()可用于本机python对象,或者您无法在特定情况下自定义行为。用户如何利用它。例如:在下面的代码中,我可以使用此功能,

class A(object):
  def __rt__(self,r):
      return "Yes special functions"


a=A()
print dir(a)
print a.rt('1') # AttributeError: 'A' object has no attribute 'rt'

但是

class Room(object):



  def __init__(self):
     self.people = []

  def add(self, person):
     self.people.append(person)

   def __len__(self):
     return len(self.people)



room = Room()
room.add("Igor")
print len(room) #prints 1

2 个答案:

答案 0 :(得分:3)

Python不会将一个名称翻译成另一个名称。如果已经定义了特定操作,则下调用__special_method__。例如,Python调用__and__方法挂钩到&运算符,因为Python解释器显式查找该方法并记录了它应该如何使用。< / p>

换句话说,调用object.rt()不会在任何地方转换为object.__rt__(),而不会自动转换为__special_method__

请注意,Python 保留这样的名称;未来版本的Python可能会将该名称用于特定目的,然后使用__*__名称的现有代码将用于您自己的目的。

来自Reserved classes of identifiers section

  

__*__
  系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在Special method names部分和其他地方进行了讨论。更多可能会在未来的Python版本中定义。在任何情况下,如果没有明确记录使用,class SomeBaseClass: def rt(self): """Call the __rt__ special method""" try: return self.__rt__() except AttributeError: raise TypeError("The object doesn't support this operation") 名称的任何使用都会在没有警告的情况下破损。

当然,你可以忽略这个建议。在这种情况下,您必须编写实际上调用您的方法的代码

SomeBaseClass

var eventListings的子类。

同样,Python不会自动调用您的新方法。你仍然需要实际编写这样的代码。

答案 1 :(得分:1)

因为您可以覆盖内置方法然后可以使用它们,所以ex __len__ - &gt; len()__str__ - &gt; str()等等。

以下是list of these functions

  

可以定义以下方法来自定义类实例的属性访问(使用,赋值或删除x.name)的含义。