Python:使用__init__引用任何创建的对象

时间:2014-07-13 12:26:33

标签: python object init refer

构建一个程序,我在其中使用构造函数方法。 我的方法如下:

class Myclass:
    population = 0
    def __init__(self, var1, var2, var3):
        Myclass.population +=1
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3
        popFile = open('pop.txt', 'wt')
        popFile.write('population = ' + str(int(Myclass.population)))
        print('blablabla')
        print('again blablabla')
        popFile.close()
        pliada = (var1, var2, var3)
        outFile = open('prog.txt', 'at')
        outFile.write(str(pliada) + '\n')
        outFile.close()

我的问题是在上面的

outFile.write(str(pliada) + '\n')

我想保存除元组之外的对象名称!我还应该在write()函数中添加什么?

例如,当我运行程序时,我输入:

First = Myclass('firstvar','secondvar','thirdvar')

当我使用

print(First)

它只打印上面的元组。当我打开prog.txt时,再次只有那里的元组。 如何引用每个对象的名称(正在构建),这样我的程序将保存第一个而不是保存(' firstvar',#secondvar',thirdvar') (' firstvar',' secondvar',thirdvar'),其中First是我输入程序的var?

由于

3 个答案:

答案 0 :(得分:3)

在对象创建时,对象没有名称。实际上,虽然模块,类型和函数是使用__name__属性创建的,但从根本上说,拥有一个名称并不是Python的类型系统功能。

In [12]: compile("First = Myclass('firstvar','secondvar','thirdvar')", "sample", "single")
Out[12]: <code object <module> at 0xf5fde458, file "sample", line 1>

In [14]: dis.dis(Out[12])
  1           0 LOAD_NAME                0 (Myclass)
              3 LOAD_CONST               0 ('firstvar')
              6 LOAD_CONST               1 ('secondvar')
              9 LOAD_CONST               2 ('thirdvar')
             12 CALL_FUNCTION            3
             15 STORE_NAME               1 (First)
             18 LOAD_CONST               3 (None)
             21 RETURN_VALUE

请注意,在使用First调用Myclass之后,名称CALL_FUNCTION才会显示。因此,Myclass返回的对象对First的存在没有任何线索(事实上,直到分配STORE_NAME之后它才存在)。通过追溯堆栈来查找调用者调用构造函数然后解释未来执行以找到名称的唯一方法就是找到一些疯狂的黑魔法。并不保证甚至存在,更不用说像这个样本一样容易理解。

然而,你的对象是一个身份。身份不是普遍唯一的,但是当对象存在时,没有其他对象在同一个进程中具有相同的身份。您可以使用id(self)找到该身份,默认字符串化也包含它:str(f)生成类似<__main__.Foo instance at 0xf603f46c>的内容(模块和类的名称,而实例ID以十六进制打印) 。

一旦名称确实存在,它就不是对象的属性,而是执行代码的命名空间中的条目(可能是模块或函数调用)。它同样可以分配给任何其他类似的条目,例如其他对象的属性,并且它们都不是特别权威的;每个都指向同一个未命名的对象。

如果您确实想要命名对象,最简单的方法是简单地将名称传递给创建,就像所有varN属性一样。

答案 1 :(得分:1)

在你写的评论中写道:

  

我对这个计划的目的是创造具有3个特征的人。例如:Yann = PeopleClass('Tall','Thin',33)

如果您希望名称“Yann”是该人的属性,则应将其作为对象的属性包含(并可能将其作为参数传递给构造函数),而不是将其用作变量名称。变量名不应该是数据!

并非所有对象都绑定到具有简单名称的变量。例如,如果您有人员列表,则可以通过people_list[0]people_list[1]等标识来访问这些人员。打印出来的那些不会太吸引人了!类似地,单个对象可以在具有不同名称的变量中多次绑定。如果您在上面的评论中运行了代码后,您执行了John = Yann,则可以通过变量YannJohn访问相同的PersonClass实例,并且您的代码会非常困难知道在任何特定时刻使用了哪些。

所以,而不是:

Yann = Person("Tall", "Thin", 33)

执行:

my_person = Person("Yann", "Tall", "Thin", 33)

(当然,更新类定义以接受并存储传入的名称。)

答案 2 :(得分:0)

我认为你能做到的唯一方法是将对象的名称作为另一个参数传递给 init 方法。

First = MyClass(“First”,“first_var”,“second_var”,“third_var”)

==============

self指向创建它的对象

self + str(pliada)+'\ n'