我正在尝试学习python类的基本构造。我有以下代码,它们完全运行良好:
class Test1:
name = 'Choton'
age = 28
class Test2: # __init__ function executes whenever the class is called
def __init__(self):
self.name = 'Choton'
self.age = 28
print('Class Test2 is called and initialized...')
def main():
# Test1
print(f'Test1:')
print(f'Test1().name = {Test1().name}, Test1().age = {Test1().age}')
print(f'Test1.name = {Test1.name}, Test1.age = {Test1.age}\n')
# Test2
print(f'Test2:')
print(f'Test2().name = {Test2().name}, Test2().age = {Test2().age}')
# DOES NOT WORK
# print(f' name = {Test2.name}, age = {Test2.age}')
if __name__ == '__main__':
main()我知道,每当初始化一个类时,__init__函数都会运行。在这里,Test1类没有任何__init__函数,Test1.name和Test1().name都很好。但是,每当我在Test2中使用Test2函数调用名称时,Test2.name就不再工作了。如果取消对该行的注释,它将显示以下错误:AttributeError: type object 'Test2' has no attribute 'name'。
这里有什么区别?为什么这两种语法都适用于一个类而不是另一个类呢?我对此有点困惑。这里有没有语法糖,或者我遗漏了什么概括?
发布于 2022-08-22 14:20:43
我花了很长时间才开始上课,现在还没到。init函数并不是每个类都需要的,它用于为类属性分配不同的值。
想了解情况,
Test1是这门课。
Test1()是类的一个实例。
两者都可以分配。所以你可以说:
MyClassInstanceA = Test1()
MyClassInstanceB = Test1()..。这两个项是不同的,因为它们都是Test1类的实例,每个实例都是唯一的。
或者你可以说
MyClassA = Test1
MyClassB = Test1..。这两者都是分配给Test1的,而不是Test1().
姓名和年龄是属性。对于Test1,它们是“类属性”。也就是说,存在在类级别上。可以通过类或类的实例访问它们。记住,Test1是类,Test1()是类的一个实例。
Test1()和Test1之间的细微差别是导致错误的原因。
来进一步解释。在Test1类中,在创建类的实例之前,类中存在两个属性名称和年龄。如果我们确实创建了任何实例,那么所有实例之间的名称和年龄属性将是相同的。但重要的是,我们不需要创建类的实例来访问它们。这就是为什么That 1.That有效..。
另一方面,在Test2类中。只有在类启动时才创建属性( init函数就是这样做的)。在那之前他们不存在。因此,当我们想要访问它们时,您需要通过类Test2().name.的实例访问它们.
MyClassC = Test2..。仍然没有类的实例,所以名称或年龄不存在
MyClassInstanceD = Test2()..。现在我们有了这个类的一个实例,所以名称和年龄是存在的,并且可以通过名为MyClassInstanceD的类来访问它.
MyClassInstanceD.name = 'Choton'但是,由于名称和年龄只存在于实例中,所以我们仍然不能调用
Test2.name因为它仍然不存在,而且永远不会存在,除非您修改Test2类.
发布于 2022-08-22 13:44:38
在Test1中,您定义了类变量,这些变量在所有对象之间共享,可以使用类访问(Test1.name),也可以从实例(Test1().name)访问。在self.name中定义Test2.__init__使其成为实例变量,该变量仅适用于类的特定实例,例如Test2()创建的新对象。
https://stackoverflow.com/questions/73446075
复制相似问题