我是否违反了OOP的基本规则?

2024-05-16 17:55:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我是OOP和python的新手,我只是想知道我所做的事情是否在OOP中是“允许的”,以及我所做的事情是否有名字。我有排队课

all_postcodes = Queue()。queue类有一个方法大小来查看其中有多少元素。你知道吗

class Queue:
    def __init__(self):
        self.__items=[]

    def size(self):
        return len(self.__items)

我还有另一个类接受队列实例。你知道吗

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)

是否允许将一个类的实例作为另一个类的参数,并使用它的方法?如果是的话,我在做什么有名字吗?你知道吗


Tags: 实例方法selfsizequeueinitdefitems
2条回答

您可以使用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))

这不仅是允许的,而且基本上是您希望首先使用OO的主要原因:设计一个新类型Queue,其行为类似于内置类型。你知道吗

考虑一下int。一个int有一些你不知道或不关心的内部状态。1你关心的是,在某种程度上,它表示一个整数值,并且它提供了对该表示有意义的操作。如果将int 23print相加,则得到输出5。你知道吗

这正是你对Queue所做的。就外界所感兴趣的而言,它以某种方式表示一个项目队列,只要它提供了始终如一的有意义的操作,比如您的size。你知道吗

因此,现在something可以使用Queue实例作为其属性之一,与使用int的方式完全相同。你知道吗


唯一的问题是你可能想用_items而不是__items作为你的私有列表。在Python中,这两个名称都是“按约定私有的”,但是__items走得更远,并且会损坏名称,使得从外部使用它稍微困难一些。这对于保护没有帮助,但是对于避免意外冲突非常有用,特别是在子类或超类意外使用相同名称的情况下。因此,通过使用__items,您发出的信号是您期望Queue成为继承层次结构的一部分,子类由不知道如何实现Queue的人编写。如果那不是真的,最好不要发出信号。你知道吗


1。在CPython中,它是一个由30位int32数字组成的链表,第一个有符号,其余的无符号。看,我告诉过你你不知道也不关心它。

相关问题 更多 >