我如何使用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
答案 0 :(得分:3)
Python不会将一个名称翻译成另一个名称。如果已经定义了特定操作,则在下调用 换句话说,调用 请注意,Python 保留这样的名称;未来版本的Python可能会将该名称用于特定目的,然后使用 来自Reserved classes of identifiers section: 当然,你可以忽略这个建议。在这种情况下,您必须编写实际上调用您的方法的代码: 和 同样,Python不会自动调用您的新方法。你仍然需要实际编写这样的代码。__special_method__
。例如,Python调用__and__
方法挂钩到&
运算符,因为Python解释器显式查找该方法并记录了它应该如何使用。< / p>
object.rt()
不会在任何地方转换为object.__rt__()
,而不会自动转换为__special_method__
。__*__
名称的现有代码将用于您自己的目的。
__*__
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在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
的子类。
答案 1 :(得分:1)
因为您可以覆盖内置方法然后可以使用它们,所以ex __len__
- &gt; len()
,__str__
- &gt; str()
等等。
可以定义以下方法来自定义类实例的属性访问(使用,赋值或删除x.name)的含义。