Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我是否应该使用“;“自我”;要定义实例类的变量/对象,我不需要从外部访问这些变量/对象?_Python_Oop_Python 2.7_Python 2.x - Fatal编程技术网

Python 我是否应该使用“;“自我”;要定义实例类的变量/对象,我不需要从外部访问这些变量/对象?

Python 我是否应该使用“;“自我”;要定义实例类的变量/对象,我不需要从外部访问这些变量/对象?,python,oop,python-2.7,python-2.x,Python,Oop,Python 2.7,Python 2.x,我不是一个完全的初学者,但对Python还是相当陌生的。今天在做一个项目的时候,我刚刚有了一个想法,想知道“self”的用法;关于这一点我已经读了一段时间了,但我仍然不知道这是否总是必要的。我的问题只涉及类的实例和实例参数/变量这个问题不是关于影响所有实例的类变量 示例: class C: def __init__(self, parent = None): super(C, self).__init__(parent) self.some_temp_va

我不是一个完全的初学者,但对Python还是相当陌生的。今天在做一个项目的时候,我刚刚有了一个想法,想知道“self”的用法;关于这一点我已经读了一段时间了,但我仍然不知道这是否总是必要的。我的问题只涉及类的实例和实例参数/变量这个问题不是关于影响所有实例的类变量

示例

class C:
    def __init__(self, parent = None):
        super(C, self).__init__(parent)
        self.some_temp_var = AnotherClass()
        self.important_property = self.some_temp_var.bring_the_jewels()

ins_c = C()
print ins_c.important_property 
在上面的代码中,我在两个变量声明(一些临时变量重要属性之前使用了self

以后需要从外部(创建实例的地方)访问**重要属性**,甚至可能修改它

但是我不需要访问指向它的另一个类()和/或变量(some\u temp\u var)的实例。我只需要it类的一个实例一次,我只需要执行它的方法一次来填充重要属性的值

在声明该变量之前,我还应该使用self吗

self.some_temp_var = ....
self.important_property = ....
或者可以是:

some_temp_var = ....
self.important_property = ....
谢谢你的帮助


另外,我做了大量的研究。由于缺乏英语和/或CS知识,我可能没有找到当前存在的副本,但我确实搜索了很多。在将此问题称为“重复”或“非建设性”之前,请仔细阅读。这是一个答案明确的问题,这是一件非常重要和复杂的事情。感谢您的理解。

如果您不使用self.some\u temp\u var,那么您正在定义一个局部变量,它将在构造函数之后被垃圾收集

因此,如果您想定义一个实例属性,并且该属性应该与该实例保持一致,那么您需要
self
。你需要它是公开的还是私人的,这是一个命名的问题。在其前面加上
\uu
表示受保护,或
\u
表示专用

如果
some\u temp\u var
只是构造函数的一个临时变量,并且您不再需要它,那么就不需要
self
。它是关于持久性和成员属性的。您不需要使用
self
在单个方法中处理变量


考虑一下。。。如果
some_temp_var
是您为获得实际结果值而构建的一些庞大数据结构,该怎么办?您不想使用
self
来存储临时变量,因为在您删除它或实例之前,它不会释放内存。您希望在不再需要时将其清理干净

看起来您根本不需要变量,那么:

class C:
    def __init__(self, parent=None):
        super(C, self).__init__(parent)
        self.important_property = AnotherClass().bring_the_jewels()
针对你的评论:

我需要把自我放在哪里。如果要在
\uuuuu init\uuuuuu
期间创建、引用和使用一次,则在它前面

不,你没有。然后使用一个正则变量,在退出
\uuuuu init\uuuu
后,对象将被垃圾收集

class C:
    def __init__(self, parent = None):
        super(C, self).__init__(parent)
        some_temp_var = AnotherClass()
        self.important_property = some_temp_var.bring_the_jewels()

Python并没有真正区分“public”和“private”变量。在self中使用“self.something=value”指定给名称的任何内容都将是该实例的实例变量

Python有两个与此相关的约定:

1) Python字段或方法的前缀带有下划线(“u1”),以告知用户“这不是此类之外的问题”。单下划线是一种传统的方式,用来或多或少地标识像C#这样的语言所称的“受保护”变量:它是实现的内部变量,除了这个类和派生类之外,应该单独使用它。双下划线类似于C#“private”变量:它是内部变量,即使是派生类也应该单独使用,不能重写

class Example(object):
    def __init__(self)
       self._protected= "protected"
       self.__private = "private"
       self.public = "public"

class Derived(Example):
    pass

d = Derived()
print d._protected
>> protected
print d.__private
>> AttributeError: 'Derived' object has no attribute '__private'
严格来说,单下划线只是一种排版惯例。双下划线实际上会损坏类内的名称以防止继承

2) 如果另一个类实际上将挂起,并且操纵另一个类实例会影响另一个类的状态,那么您的示例可能就是使用属性装饰器的情况

class C:
    def __init__(self, parent = None):
        super(C, self).__init__(parent)
        self._private = AnotherClass()

    @property
    def public(self):
       return self._private.some_method_on_AnotherClass()

    @public.setter
    def set_pub(self, val)
       self._private.set_value_on_AnotherClass(val)

我不是在问“如何缩短代码行数?”。这只是一个例子。也许我在100行代码中使用一些临时变量来执行超级重复的疯狂计算?关键是,我需要把自我。如果要在init.Hello@jdi期间创建、引用和使用它一次,就在它前面。这是一个很好的解释,谢谢。快速提问:在使用Qt及其绑定的情况下,如果我创建一个Qpalete()对象来用.setPalette()装饰self,您认为Qpalete()对象的变量(比如bg_plt)应该是self.bg_plt还是仅仅是bg_plt?好问题。你不需要坚持下去。使用本地变量执行setPalette()将复制它。Qt还具有QoObject的父/子概念(不是Qpalete,而是实际的QoObject类),其中设置父对象将使内存管理自动化。这意味着您不需要保存引用以在以后清理它。它将在父级删除时删除。同样的情况是,只需要为那些需要连续访问或持久化类的成员保留成员属性。谢谢@theodox。这将帮助很多人。回答得很好。