直接在代码中创建类实例的目的是什么

问题描述

Pyhon允许像创建新变量一样创建任何类实例属性,而您无需在类定义中定义它们。 这样做的目的是什么?

class MyClass:
    def __init__(self):
        pass

obj = MyClass()
obj.a = '1';
print(obj.a)
#>> 1

P.S。 找到了此类用法的有趣示例 Can you use a string to instantiate a class 动态创建的属性用于存储动态实例化的类

解决方法

这样做的目的是简单:在方法内部或外部访问实例没有区别。在方法内部和外部看到的对象是完全等效的,并且通过扩展,相同的规则适用于任何地方:

class MyClass:
    def __init__(self):
        print(self)  # <__main__.MyClass object at 0x119636490>
        self.b = 12  # assign to an instance

obj = MyClass()
print(obj)           # <__main__.MyClass object at 0x119636490>
obj.b = 12           # # assign to an instance

请注意,可以在方法内部和外部读取和写入属性,并且这些属性在方法内部和外部均可见。实际上,除了double-underscore name mangling之类的一些代码重写之外,Python没有方法的“内部”和“外部”概念。

这既是结果,也是启用功能,允许其他语言的各种内置功能在没有明确支持的情况下工作。例如,Python允许extension methods的等效项,而没有额外的语法/功能:

class MyPoint:
    def __init__(self,x,y):
        self.x,self.y = x,y

# Oops,forgot a repr!
def my_point_repr(self):
    return f'{self.__class__.__name__}(x={self.x},y={self.y})'

MyPoint.__repr__ = my_point_repr
print(MyPoint(1,2))  # MyPoint(x=1,y=2)