0

我正在构建一个程序,在该程序中我在类中使用构造函数方法。我的方法如下所示:

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'),而不是保存 First('firstvar','secondvar',thirdvar'),其中 First 是我进入程序的var?

谢谢

4

3 回答 3

3

在对象创建时,对象没有名称。事实上,有一个名字本质上不是 Python 的类型系统函数的方式,尽管模块、类型和函数是用__name__属性创建的。

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

请注意,在使用 after 调用First之前,该名称根本没有出现。因此,Myclass 返回的对象不知道 First 的存在(事实上,直到赋值 STORE_NAME 之后它才存在)。唯一能找到它的方法是一些疯狂的黑魔法,通过追溯堆栈来找到调用者在什么时候调用了构造函数,然后解释未来的执行以找到名称;而且它甚至不能保证存在,更不用说像这个样本那样容易理解了。MyclassCALL_FUNCTION

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

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

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

于 2014-07-13T12:44:36.090 回答
1

你在评论中写道:

好吧,我在这个项目上的目的是创造具有 3 个特征的人。例如: Yann = PeopleClass('Tall', 'Thin', 33)

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

并非所有对象都绑定到具有简单名称的变量。例如,如果您有一个人员列表,您可以通过 和 之类的标识符访问people_list[0]他们people_list[1]。不过,这些不会太有吸引力而无法打印出来!类似地,单个对象可以在具有不同名称的变量中多次绑定。如果在您运行上述注释中的代码之后,您执行了John = Yann,则可以通过变量Yann和访问相同的 PersonClass 实例John,并且您的代码将很难知道在任何给定时刻正在使用哪个。

所以,而不是:

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

做:

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

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

于 2014-07-13T13:23:03.270 回答
0

我认为您可以这样做的唯一方法是将对象的名称作为另一个参数传递给init方法。

First = MyClass("First", "first_var", "second_var", "third_var")

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

self 指向创建它的对象

自我 + str(pliada) + '\n'

于 2014-07-13T12:37:19.290 回答