类的每个python对象在创建后都具有相同的属性值
我有两个类类的每个python对象在创建后都具有相同的属性值,python,class,oop,object,monostate,Python,Class,Oop,Object,Monostate,我有两个类BaseNode和BaseEdge,我可以使用connect方法通过这些类中的边连接两个节点 代码 这是我的BaseNode: class BaseNode: def __init__(self,edges=[],value=None,edges_limit=math.inf): self.edges = edges self.value = value self.limit = edges_limit self.edge_class = BaseE
BaseNode
和BaseEdge
,我可以使用connect
方法通过这些类中的边连接两个节点
代码
这是我的BaseNode
:
class BaseNode:
def __init__(self,edges=[],value=None,edges_limit=math.inf):
self.edges = edges
self.value = value
self.limit = edges_limit
self.edge_class = BaseEdge
self.adjs = []
def get_adjacents(self):
if not self.edges:
return []
for edge in self.edges :
self.adjs.append(edge.n2)
return self.adjs
def get_edges(self):
return self.edges
def connect(self,other):
"""
connect two nodes by connecting an edge between them
"""
if not isinstance(other,self.__class__):
raise ValueError(f'Node should be type of {self.__class__.__name__}')
if len(self.edges) == self.limit :
raise MaximumEdgeReached(f'maximum edge reached the limit is {self.limit} ')
e = BaseEdge()
e.set_nodes(self,other)
self.edges.append(e)
和BaseEdge
class:
class BaseEdge:
def __init__(self):
self.n1 = None
self.n2 = None
self.node_class = BaseNode
def get_nodes(self):
return (self.n1,self.n2,)
def set_nodes(self,n1,n2):
a = isinstance(n1,self.node_class)
b = isinstance(n2,self.node_class)
if not a and b :
raise ValueError(f'nodes of this edge should be {self.node_class}')
self.n1 = n1
self.n2 = n2
def connect(self,n1=None,n2=None):
if not self.n1 and self.n2 :
self.set_nodes(n1,n2)
self.n1.edges.append(self)
self.n2.edges.append(self)
我试过什么?
我尝试从BaseNode
和BaseEdge
连接节点以查看结果。
节点应具有相同的边,但出现了两个问题:
n1
和n2
的edges
属性有两个作为边的e
实例!但是edges
应该有一个BaseEdge
BaseNode
创建新对象时,edges
属性对它们具有相同的值李>
n1=BaseNode()
>>>n2=BaseNode()
>>>e=基边()
>>>e.set_节点(n1、n2)
>>>e.连接()
>>>n2.边缘
[, ]
>>>n1.边缘
[, ]
>>>n3=BaseNode()#初始化新项目
>>>n3.边缘
[, ]
注意:当我使用BaseNode
类的connect
方法时。它也有同样的问题
BaseNode
类的行为就像一个单状态类。这是不应该的!
请帮我解决这个问题。这是一个旧的可变默认参数问题——为了避免再次键入,我建议您阅读以下内容: 本质上,不是这样定义函数
def my_function(input_list=[]):
input_list.append(2)
...
你应该把它定义为
def my_function(input_list=None):
if input_list is None:
input_list = []
input_list.append(2)
...
这可以防止默认参数
[]
在后续函数调用中被重复使用。因为默认参数在函数定义时只计算一次,所以每次使用默认参数def\uu init\uuuuuuuuu(self,edges=[],value=None,edges\u limit=math.inf):
edges参数时,您正在使用相同的列表对象是!有效:)谢谢。
def my_function(input_list=None):
if input_list is None:
input_list = []
input_list.append(2)
...