我是OOP和python的新手,我只是想知道我在做什么是"允许"在OOP中,如果我正在做的事情有一个名字。我有一个队列类
all_postcodes = Queue()
。队列类的方法大小可以查看其中有多少元素。
class Queue:
def __init__(self):
self.__items=[]
def size(self):
return len(self.__items)
我还有另一个接受Queue实例的类。
class something:
def __init__(self,postcode):
self.postcode = postcode
self._original_matrix = numpy.zeros((self.postcode.size(), self.postcode.size())))
然后我调用类似的东西:
all_postcodes_matrix = something(all_postcodes)
你是否允许将一个类的实例作为另一个类的参数并使用它的方法?如果你是,那我的名字是否有名字?
答案 0 :(得分:4)
这不仅是允许的,它基本上是你想要首先使用OO的主要原因:设计一个新类型Queue
,它就像一个内置类型。
考虑int
。 int
有一些你不了解或不关心的内部状态。 1 你关心的是它在某种程度上代表一个整数值,它提供对该表示有意义的操作。如果您在结果中添加整数2
和3
以及print
,则会获得输出5
。
这正是您使用Queue
所做的。就外部世界感兴趣而言,只要它提供一致有意义的操作,就像你的size
一样,它以某种方式表示项目队列,他们既不知道也不关心。
因此,现在something
可以使用Queue
实例作为其属性之一,与使用int
的方式完全相同。
唯一的狡辩是,您可能希望将_items
代替__items
用于您的私人列表。在Python中,两者都按照约定"私有,但__items
更进一步,并且使名称变得更加难以从外部使用。这对保护没有用,但它对于避免意外冲突很有用,特别是在子类或超类意外使用相同名称的情况下。因此,通过使用__items
,您发信号通知您希望Queue
成为继承层次结构的一部分,子类由不知道如何{{1}的人编写已实施。如果这不是真的,最好不要发出信号。
<子> 1。在CPython中,它是一个30位Queue
数字的链表,第一个是有符号的,其余的是无符号的。看,我告诉过你,你并不知道或不关心它。
答案 1 :(得分:0)
您可以使用Python's magic methods,尤其是__len__.
您可以使用此魔术方法直接在您的班级实例上调用len()
。
class Queue:
def __init__(self):
self._items = []
def __len__(self):
return len(self._items)
if __name__ == '__main__':
queue = Queue()
print(len(queue))