我打破任何基本的OOP规则吗?

时间:2018-03-28 17:37:04

标签: python oop

我是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)

你是否允许将一个类的实例作为另一个类的参数并使用它的方法?如果你是,那我的名字是否有名字?

2 个答案:

答案 0 :(得分:4)

这不仅是允许的,它基本上是你想要首先使用OO的主要原因:设计一个新类型Queue,它就像一个内置类型。

考虑intint有一些你不了解或不关心的内部状态。 1 你关心的是它在某种程度上代表一个整数值,它提供对该表示有意义的操作。如果您在结果中添加整数23以及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))