在同一个python程序中编写两个名称相同的类有意义吗?

在同一个python程序中编写两个名称相同的类有意义吗?,python,python-3.x,oop,Python,Python 3.x,Oop,在任何情况下,使用不同的参数在同一个程序中使用相同的名称编写两个python类是否有意义?我正在考虑这个程序,但我的第二个测试类将覆盖第一个。总是这样吗 class test: def __init__(self): print("first class") def oneplus(self, x): print(x + 1) class test: def __init__(self): print("second cl

在任何情况下,使用不同的参数在同一个程序中使用相同的名称编写两个python类是否有意义?我正在考虑这个程序,但我的第二个测试类将覆盖第一个。总是这样吗

class test:
    def __init__(self):
        print("first class")
    def oneplus(self, x):
        print(x + 1)

class test:
    def __init__(self):
        print("second class")
    def twoplus(self, x):
        print(x + 2)

t = test()
t.twoplus(1)  
只会导致使用第二个实例:

second class
3

是的,如果您使用与现有类相同的名称定义一个类,它将覆盖该定义

但第一类的现有实例仍将照常运行

小例子:

课堂测试: 定义初始自我: 一等印刷品 def oneplusself,x: printx+1 t1=测试 课堂测试: 定义初始自我: 二等印刷品 def twoplusself,x: printx+2 t2=试验 t1.1加1 t2.twoplus1 输出:

first class
second class
2
3
如果您从未使用过第一类,像PyCharm这样的IDE甚至会警告您:

是,如果您使用与现有类相同的名称定义一个类,它将覆盖该定义

但第一类的现有实例仍将照常运行

小例子:

课堂测试: 定义初始自我: 一等印刷品 def oneplusself,x: printx+1 t1=测试 课堂测试: 定义初始自我: 二等印刷品 def twoplusself,x: printx+2 t2=试验 t1.1加1 t2.twoplus1 输出:

first class
second class
2
3
如果您从未使用过第一类,像PyCharm这样的IDE甚至会警告您:

如上所述,第二次测试分配将覆盖第一次分配。基本上,当一个类在Python中被赋值时,它将以类型、值和引用计数存储在内存中。在本例中,第一个Test赋值创建了一个引用计数为1的python对象Test1,第二个Test赋值创建了另一个引用计数为1的python对象Test2,但Test不再引用原始python对象Test1,因此其引用计数减少到0


python对象的绝佳资源:

如上所述,测试的第二个赋值将覆盖第一个赋值。基本上,当一个类在Python中被赋值时,它将以类型、值和引用计数存储在内存中。在本例中,第一个Test赋值创建了一个引用计数为1的python对象Test1,第二个Test赋值创建了另一个引用计数为1的python对象Test2,但Test不再引用原始python对象Test1,因此其引用计数减少到0


python对象的绝佳资源:

除非您计划让系统只识别第二个定义,否则使用相同名称的两个变量不会有什么区别。

除非您计划让系统只识别第二个定义,然后,使用相同名称创建两个变量不会产生任何差异。

一个程序可能包含多个模块。在这种情况下,使用相同名称的类是很有意义的。例如,如果您有一个功能在Windows和Linux中的工作方式不同,那么您可以有一个模块实现Windows特定的东西,还有一个模块实现Linux特定的东西。两者都有同名的类。在代码中,您可以

if os.name == nt:
    from windows_support import Feature
else:
    from linux_support import Feature
这可以用于任何外部影响,而不仅仅是平台

如果只有少量差异,通常是相关模块的子集,那么在If语句的不同分支中可以有两个名称相同的类。例如:

if os.name == 'nt':
    class Feature:
        ...
else:
    class Feature:
        ...
语句def、class和大多数形式的导入都是赋值。在不同的条件下为名称指定不同的值与为不同的类或函数指定不同的值一样有意义。毕竟,类在python中只是对象

也就是说,如果两个选项都实现了相同的公共接口,那么上述所有示例都能发挥最佳效果


类型提示的前向声明是不同类在同一名称空间中无条件地具有相同名称的一个示例,该名称空间用于实际用途。在Python3.7中引入延迟的注释求值之前,在赋值之前,不可能在注释中使用类名。通过扩展,这意味着类的方法不能接受或返回它们在其中定义的类的实例,如果没有解决方法,类之间的循环引用就不受支持。解决方法是在类型提示中使用相同名称的类之前,先定义一个空的类定义。这实际上会保留对forward声明的一次性类的引用,这是PEP 563的动机之一。

一个程序可能包含多个模块。在这种情况下,使用相同名称的类是很有意义的。例如,如果您有一个在Windows和Linux中工作方式不同的功能,您可以 可以有一个模块实现windows特定的东西,还有一个模块实现Linux特定的东西。两者都有同名的类。在代码中,您可以

if os.name == nt:
    from windows_support import Feature
else:
    from linux_support import Feature
这可以用于任何外部影响,而不仅仅是平台

如果只有少量差异,通常是相关模块的子集,那么在If语句的不同分支中可以有两个名称相同的类。例如:

if os.name == 'nt':
    class Feature:
        ...
else:
    class Feature:
        ...
语句def、class和大多数形式的导入都是赋值。在不同的条件下为名称指定不同的值与为不同的类或函数指定不同的值一样有意义。毕竟,类在python中只是对象

也就是说,如果两个选项都实现了相同的公共接口,那么上述所有示例都能发挥最佳效果


类型提示的前向声明是不同类在同一名称空间中无条件地具有相同名称的一个示例,该名称空间用于实际用途。在Python3.7中引入延迟的注释求值之前,在赋值之前,不可能在注释中使用类名。通过扩展,这意味着类的方法不能接受或返回它们在其中定义的类的实例,如果没有解决方法,类之间的循环引用就不受支持。解决方法是在类型提示中使用相同名称的类之前,先定义一个空的类定义。这实际上会保留对forward声明的throwaway类的引用,这是PEP 563的动机之一。

Python是解释语言,它会从上到下进行评估。除了类测试的第二个定义将覆盖第一个定义之外,没有其他可能的结果。类语句只是一个非常奇特的赋值语句。这里的语义与x=3相同;x=5;断言x==5。简短的回答是不,没有任何好的理由这样做。当然,在不同的模块中,可以有同名的不同类,但在同一个模块中,除了增加混淆之外,它不会做任何事情。您的程序中可能有两个同名的不同类,但在不同的模块中。您还可能有一个给定名称的类的多个实现,其中一个是根据您运行的平台或其他类似的运行时详细信息选择的。现在,如果两个类都被修饰,那么修饰器可能会将对该类的引用保存到其他地方,在这种情况下,test不再是类的唯一引用。Python是解释语言,它从上到下进行计算。除了类测试的第二个定义将覆盖第一个定义之外,没有其他可能的结果。类语句只是一个非常奇特的赋值语句。这里的语义与x=3相同;x=5;断言x==5。简短的回答是不,没有任何好的理由这样做。当然,在不同的模块中,可以有同名的不同类,但在同一个模块中,除了增加混淆之外,它不会做任何事情。您的程序中可能有两个同名的不同类,但在不同的模块中。您还可能有一个给定名称的类的多个实现,其中一个是根据您运行的平台或其他类似的运行时详细信息选择的。现在,如果两个类都被修饰,那么修饰器可能会将对该类的引用保存到其他地方,在这种情况下,test不再是对类的唯一引用。Worth指出,在这种情况下,t1.\uuuuu class\uuuuuu是对原始类的附加引用,这就是为什么重新分配test不会改变t1的行为。Worth指出,在这种情况下,t1.\uuu class\uuuuuuu是对原始类的附加引用,这就是为什么重新分配测试不会改变t1的行为。