Python 我是否违反了OOP的基本规则?
我是OOP和python的新手,我只是想知道我所做的事情在OOP中是否是“允许的”,以及我所做的事情是否有名字。我有一节排队课Python 我是否违反了OOP的基本规则?,python,oop,Python,Oop,我是OOP和python的新手,我只是想知道我所做的事情在OOP中是否是“允许的”,以及我所做的事情是否有名字。我有一节排队课 所有邮政编码=队列()。队列类有一个方法大小,可以查看其中有多少元素 class Queue: def __init__(self): self.__items=[] def size(self): return len(self.__items) 我还有另一个类,它接受队列实例 class something:
所有邮政编码=队列()
。队列类有一个方法大小,可以查看其中有多少元素
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)
是否允许将一个类的实例作为另一个类的参数,并使用它的方法?如果是的话,我正在做的事情有名字吗?这不仅是允许的,而且基本上是您希望首先使用OO的主要原因:设计一个新类型,
队列,它的行为类似于内置类型
考虑int
。int
具有一些您不知道或不关心的内部状态。1您关心的是,在某种程度上,它表示一个整数值,并提供对该表示有意义的操作。如果将int2
和3
以及print
添加到结果中,则会得到输出5
这正是您使用Queue
所做的。就外部世界所感兴趣的而言,它以某种他们既不知道也不关心的方式表示一个项目队列,只要它提供的操作始终是有意义的,比如您的大小
因此,现在something
可以使用Queue
实例作为其属性之一,与使用int
的方式完全相同
唯一的诡辩是,您可能希望在您的私人列表中使用\u项
,而不是\u项
。在Python中,两者都是“按约定私有的”,但是\u items
更进一步,并且会损坏名称,使得从外部使用它稍微困难一些。这对于保护没有帮助,但对于避免意外冲突非常有用,特别是在子类或超类意外使用相同名称的情况下。因此,通过使用\uu项
,您表示希望队列
成为继承层次结构的一部分,子类由不知道如何实现队列
的人编写。如果这不是真的,最好不要发出信号
一,。在CPython中,它是一个由30位int32
数字组成的链表,第一个数字有符号,其余数字无符号。看,我告诉过你,你不知道也不关心它。这不仅是允许的,而且基本上是你想首先使用OO的主要原因:设计一个新类型,队列,就像一个内置类型一样
考虑int
。int
具有一些您不知道或不关心的内部状态。1您关心的是,在某种程度上,它表示一个整数值,并提供对该表示有意义的操作。如果将int2
和3
以及print
添加到结果中,则会得到输出5
这正是您使用Queue
所做的。就外部世界所感兴趣的而言,它以某种他们既不知道也不关心的方式表示一个项目队列,只要它提供的操作始终是有意义的,比如您的大小
因此,现在something
可以使用Queue
实例作为其属性之一,与使用int
的方式完全相同
唯一的诡辩是,您可能希望在您的私人列表中使用\u项
,而不是\u项
。在Python中,两者都是“按约定私有的”,但是\u items
更进一步,并且会损坏名称,使得从外部使用它稍微困难一些。这对于保护没有帮助,但对于避免意外冲突非常有用,特别是在子类或超类意外使用相同名称的情况下。因此,通过使用\uu项
,您表示希望队列
成为继承层次结构的一部分,子类由不知道如何实现队列
的人编写。如果这不是真的,最好不要发出信号
一,。在CPython中,它是一个由30位int32
数字组成的链表,第一个数字有符号,其余数字无符号。看,我告诉过你你不知道也不关心它。你可以利用,特别是\uuu len\uuu。
你可以用这个神奇的方法直接在你的类实例上调用len()
class Queue:
def __init__(self):
self._items = []
def __len__(self):
return len(self._items)
if __name__ == '__main__':
queue = Queue()
print(len(queue))
您可以使用,特别是\uuuu len\uuu.
您可以使用这个神奇的方法直接在类实例上调用len()
class Queue:
def __init__(self):
self._items = []
def __len__(self):
return len(self._items)
if __name__ == '__main__':
queue = Queue()
print(len(queue))
是的,事实上,这是允许的,从某种意义上说,这是OO的全部要点,能够以内置值的方式创建提供某种一致行为和状态的对象。但是,您可能不想在这里使用\u items
。这会损坏名称,因此从类外访问会稍微困难一些,而类外访问主要是为了避免类的私有属性与其子类和超类的私有属性之间发生意外冲突。它被称为组合。您应该实现神奇的方法\uuu len\uuu
,而不是size
。请看这篇文章,了解类和类实例在Python中是如何成为“第一类对象”的。它们可以很自由地传递。这甚至可能是一个有效的dup。是的,事实上,这是允许的,从某种意义上说,这是OO的全部要点,能够创建提供某种一致行为和状态的对象,就像内置值一样。但是,您可能不想在这里使用\u items
。这会损坏名称,因此从类外访问会稍微困难一些,而类外访问主要是为了避免类的私有属性与其子类和超类的私有属性之间发生意外冲突。这叫做作文,你应该