首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python类的基本知识

Python类的基本知识
EN

Stack Overflow用户
提问于 2022-08-22 13:38:29
回答 2查看 49关注 0票数 0

我正在尝试学习python类的基本构造。我有以下代码,它们完全运行良好:

代码语言:javascript
复制
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.nameTest1().name都很好。但是,每当我在Test2中使用Test2函数调用名称时,Test2.name就不再工作了。如果取消对该行的注释,它将显示以下错误:AttributeError: type object 'Test2' has no attribute 'name'

这里有什么区别?为什么这两种语法都适用于一个类而不是另一个类呢?我对此有点困惑。这里有没有语法糖,或者我遗漏了什么概括?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-22 14:20:43

我花了很长时间才开始上课,现在还没到。init函数并不是每个类都需要的,它用于为类属性分配不同的值。

想了解情况,

Test1是这门课。

Test1()是类的一个实例。

两者都可以分配。所以你可以说:

代码语言:javascript
复制
MyClassInstanceA = Test1()
MyClassInstanceB = Test1()

..。这两个项是不同的,因为它们都是Test1类的实例,每个实例都是唯一的。

或者你可以说

代码语言:javascript
复制
MyClassA = Test1
MyClassB = Test1

..。这两者都是分配给Test1的,而不是Test1().

姓名和年龄是属性。对于Test1,它们是“类属性”。也就是说,存在在类级别上。可以通过类或类的实例访问它们。记住,Test1是类,Test1()是类的一个实例。

Test1()和Test1之间的细微差别是导致错误的原因。

来进一步解释。在Test1类中,在创建类的实例之前,类中存在两个属性名称和年龄。如果我们确实创建了任何实例,那么所有实例之间的名称和年龄属性将是相同的。但重要的是,我们不需要创建类的实例来访问它们。这就是为什么That 1.That有效..。

另一方面,在Test2类中。只有在类启动时才创建属性( init函数就是这样做的)。在那之前他们不存在。因此,当我们想要访问它们时,您需要通过类Test2().name.的实例访问它们.

代码语言:javascript
复制
MyClassC = Test2

..。仍然没有类的实例,所以名称或年龄不存在

代码语言:javascript
复制
MyClassInstanceD = Test2()

..。现在我们有了这个类的一个实例,所以名称和年龄是存在的,并且可以通过名为MyClassInstanceD的类来访问它.

代码语言:javascript
复制
MyClassInstanceD.name = 'Choton'

但是,由于名称和年龄只存在于实例中,所以我们仍然不能调用

代码语言:javascript
复制
Test2.name

因为它仍然不存在,而且永远不会存在,除非您修改Test2类.

票数 0
EN

Stack Overflow用户

发布于 2022-08-22 13:44:38

Test1中,您定义了类变量,这些变量在所有对象之间共享,可以使用类访问(Test1.name),也可以从实例(Test1().name)访问。在self.name中定义Test2.__init__使其成为实例变量,该变量仅适用于类的特定实例,例如Test2()创建的新对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73446075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档