Python 我是否应该使用“;“自我”;要定义实例类的变量/对象,我不需要从外部访问这些变量/对象?
我不是一个完全的初学者,但对Python还是相当陌生的。今天在做一个项目的时候,我刚刚有了一个想法,想知道“self”的用法;关于这一点我已经读了一段时间了,但我仍然不知道这是否总是必要的。我的问题只涉及类的实例和实例参数/变量这个问题不是关于影响所有实例的类变量 示例: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
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。这将帮助很多人。回答得很好。