在这个链接,这是官方python文档的一部分,我找到了以下信息:
类对象支持两种操作:属性引用和实例化。
属性引用 使用用于 Python 中所有属性引用的标准语法。因此,如果
是一个类的名称,而MyClass
是func
的一个属性的名称,那么:MyClass
是一个有效的属性引用。MyClass.func
类实例化 使用函数符号。所以
创建一个类的新实例并将这个对象赋值给局部变量x = MyClass()
.x
出现在先前文档开头的表达式
Class object
表示类也是一个对象,而不仅仅是类的实例。
到目前为止,只有在一种情况下我使用了Attribute references 来访问类的方法而不是Class instantiation(要了解这种情况,请参阅this post)。 我一般总是创建一个类的实例并通过这个实例对象调用类的方法
通过这篇文章,我想知道,出于某些原因,有时是否会 better 使用属性引用而不对类进行任何实例化。
在问题的其余部分,我将报告一些使用 Attribute references 的代码片段,我将重复我的问题,将它们链接到示例代码。
在下面的代码中,两种方法给出了相同的结果:
class MyClass:
attribute1 = 'initial_value'
def set_attribute1_value(self, value):
self.attribute1 = value
def print_attribute1(self):
print(self.attribute1)
def main():
print("Use of ---> Class instantiation <---")
x = MyClass()
x.set_attribute1_value("new_value")
x.print_attribute1()
print("+++")
print("Use of ---> Attribute references <---")
MyClass.set_attribute1_value(MyClass, "new_value")
MyClass.print_attribute1(MyClass)
main()
main()
执行的输出是:
Use of Class instantiation
new_value
+++
Use of Attribute references
new_value
在示例中,使用属性引用避免了对象的实例化。它节省资源吗?
提示我属性引用可能适合的上下文是当类只是一个方法容器(这是我在这篇文章中发明的一个术语)如下:
class MyClass:
def method1(self, arg):
print(f"method1 executed arg={arg}")
def method2(self):
print("method2 executed")
self.__methodN(self)
# private method
def __methodN(self):
print("methodN executed")
# use of Attribute references
def main_with_attribute_references():
MyClass.method1(MyClass, "arg-value")
MyClass.method2(MyClass)
# use of an istance of class MyClass
def main_with_instance():
x = MyClass()
x.method1("arg-value")
x.method2()
我的生产应用程序包含一些此类(我认为这不是一个好的面向对象编程)。
在此示例代码中,是使用Attribute references 还是 MyClass 的实例更好?还是一样?
谢谢