【问题标题】:Python understanding classes and functionsPython 理解类和函数
【发布时间】:2020-07-21 15:04:21
【问题描述】:

python 新手,一直在努力提高我的整体技能,但是,我很难理解类和函数。

为什么我可以或不能执行以下代码

class Person():
    name = 'Tom'
    age = 31
    has_job = False

Person.name = 'Tom'
Person.age = 31
Person.has_job = False  
print(Person.name, Person.age, Person.has_job)

与此相比

class Person():
    def __init__(self, name, age, has_job):
        self.name = name
        self.age = age
        self.has_job = has_job

    
p1 = Person('Tom', 31, False)

这只是不好的做法还是完全是别的什么?

【问题讨论】:

    标签: python-3.x function class


    【解决方案1】:

    我不认为像您的第一个示例那样编写一个类会很有用,因为每个实例的属性都保持不变。 这意味着默认情况下每个人都将被称为“Tom”,年龄:41,“has_job”将设置为 false。

    在第二个示例中,您有一个特定的构造函数,它将初始化这些变量,这将更加有用。只有一个问题:你忘了在def __init__(self, name, age, has_job) 后面加上“:”。

    还要注意缩进。

    您的代码应如下所示:

    class Person():
        def __init__(self, name, age, has_job):
            self.name = name
            self.age = age
            self.has_job = has_job
     
        
    p1 = Person('Tom', 31, False)
    print(p1.name);
    

    【讨论】:

    • 哎呀,我确实忘记在我的代码末尾添加它。我也有缩进,虽然我不太确定如何添加它。糟糕的是,我对此很草率。所以如果我得到这个正确的第一个例子我给出的不是创建一个唯一的人对象,而是我传递的变量类型是静态的?
    • 我想说,如果你想代表一个人,那么每个人都应该有一个特定的年龄。当您创建一个人时,该对象已经使用您在创建类时指定的值进行了初始化。当然,在创建对象之后,您可以选择修改这些值:我的意思是,假设您使用第一个示例创建了人员 p1。 p1 现在被称为 'Tom' ... 默认情况下。您可以通过说 p1.name='John' 来更改它,但是使用构造函数直接初始化一个人的属性会更容易,就像在第二个示例中显示的那样。
    • 另外,如果您想修改类对象的属性,我建议使用 getter 和 setter,以避免“公开”访问这些变量
    • 啊,我明白了,所以我也可以做类似 p1.age = int(47) 或 p1.has_job = True 我开始更清楚地理解事情了。现在我会在创建时在对象下方执行此操作吗?与第一个示例不同,所有内容都设置为默认值。
    • 首先,不需要指定int(47),p1.age = 47就足够了。
    【解决方案2】:

    Python 对空格敏感。除非您想更改类中的默认值,否则无需重新定义它们。

    class Person():
        name = 'Tom'
        age = 31
        has_job = False
    '''
    change these will change the class values
    Person.name = 'Tom'
    Person.age = 31
    Person.has_job = False  
    '''
    print(Person.name, Person.age, Person.has_job)
    

    【讨论】:

    • 哦,我有点明白我以为我必须定义它们两次我想我还需要更多练习。
    【解决方案3】:

    在代码的第一部分,您尝试定义类属性。这些属性在类的实例之间不会改变。另一方面,如果您在 def init(self) 方法中定义变量,这些是您在创建类时必须传递的参数,并且对于您创建的类的每个实例都是唯一的。这些被称为实例属性。

    class Person():
       # these are class attributes.
       name = 'Tom'
       age = 31
       has_job = False
    
    class Person2():
       def __init__(self, name, age, has_job)
        # these are instance attributes
        self.name = name
        self.age = age
        self.has_job = has_job
    

    在您的第一个代码 sn-p 中,您在创建类时没有适当地缩进类属性。检查我上面的示例,看看如何做到这一点。

    因此,在您的情况下,由于每个人都是您的 Person 类的新实例,因此您不希望将 name、age 和 has_job 作为类属性,因为这些属性对于您创建的每个人都是唯一的。如果您将这些变量作为类属性,那么您使用 Person() 类创建的每个人都将具有相同的姓名、年龄和 has_job 值。

    如果你创建了一个具有类属性的类,然后每次都更改类实例的类属性,那么它就不是pythonic了。相反,您应该使用实例属性创建类的实例。

    我强烈建议您在 youtube 上观看 Corey Shafer OOP 教程,因为它们涵盖了所有这些内容:https://www.youtube.com/watch?v=ZDa-Z5JzLYM&list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU&index=40

    【讨论】:

    • 这真的很有见地。我一定会去看视频的。我有缩进,但是当我从记事本 ++ 粘贴代码时,我猜它没有移植它们?我有点理解正在发生的事情,尽管通过更多的时间和练习,我肯定能够理解发生了什么。
    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2018-03-07
    • 1970-01-01
    • 2014-04-24
    • 2015-01-07
    相关资源
    最近更新 更多