Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类的每个python对象在创建后都具有相同的属性值_Python_Class_Oop_Object_Monostate - Fatal编程技术网

类的每个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)
       ...