直接在代码中创建class实例属性的目的是什么

What the purpose of creating class instance attibutes directly in the code

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

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 动态创建的属性用于存储动态实例化classes

这样做的目的很简单:在方法内部或外部访问实例没有区别。在方法内部和外部看到的对象是完全等价的,推而广之,同样的规则适用于任何地方:

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

注意,方法内外都可以读写属性,而且这些属性在方法内外都是可见的。事实上,Python 没有方法“内部”和“外部”的概念,除了一些 code-rewrites 例如 double-underscore name mangling.

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

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)