python - <类名>之间的区别。 python 类中的 <var name> 和 self.<var name>

标签 python class

我想知道这两个类中的 Foo.var= user input 和 self.var= userinput 之间有什么区别。

class foo():
    var=None

    def __init__(self,userinput):
        foo.var=userinput


class bar():
    var=None

    def __init__(self,userinput):
        self.var=userinput

最佳答案

foo 指的是self 指的是对象

类成员是类的属性(因此在该类的所有对象之间共享),而实例成员是特定对象的属性,因此对实例成员的更改仅影响给定的对象。

当你操作一个对象时,它拥有的成员是成员和实例成员的合并。当定义两个同名成员时,实例成员优先。

因此:

  • bar 设置实例变量;该更改仅对当前实例有效,因此如果您这样做:

    b=bar(10)
    c=bar(20)
    

    您将看到 c.var20b.var10;这里没什么奇怪的;

  • foo 设置一个类变量,该变量对所有实例都是通用的;所以,如果你这样做:

    f=foo(10)
    g=foo(20)
    

    您会看到 f.varg.var 都将为 20,因为它们实际上都引用 foo.var,最后在 g 的构造函数中设置为 20

  • 另一方面,实例变量影子类变量;所以,如果你这样做

    f=foo(10)
    g=foo(20)
    f.var=30
    

    你将拥有g.var==foo.var==20,但是f.var==30,从现在开始f.var实例变量 f.var; 但是,如果你这样做

    del f.var
    

    现在实例(f's)属性var不再存在,因此f.var再次引用类属性 var(因此f.var==g.var==foo.var==20)。


长话短说:通常您会想要使用self.var(即实例成员); classname.var 仅用于在给定类的所有实例之间共享内容。

关于python - <类名>之间的区别。 python 类中的 <var name> 和 self.<var name>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15890651/

相关文章:

python - 如何显示所有包含这些字符的单词?

java - 双构造函数代码块、Java 中的静态代码块

python - 为什么定义类时括号是可选的,而定义函数时是必须的?

python - 在 Python 3 和 Matplotlib 中使用带字符串格式的无效语法错误

python - Django: AttributeError 表单没有属性 'is_valid'

javascript - 如何通过勾选当前部分中的复选框来勾选其他部分的所有复选框?

c# - 为什么 Scala 没有在匿名类型之间定义合理的相等性?

android - 如何将一组对象从一个 Activity 发送到另一个?

python - 是时候使用 Django 1.5 了吗?

python - 凯拉斯 |运行 Inception v3 示例