为什么我的程序会覆盖两个对象?

时间:2019-03-05 16:59:46

标签: python faker

我正在开发一个程序来创建假副本,这些副本在指定的属性中存在某种不一致之处。

我正在使用我的课程“ Firma”:

class Firma:
    def __init__(self, firma, strasse, plz, ort, telefon):
        self.firma = firma
        [...]

    def getFirma(self):
       return self.firma
        [...]

    def setFirma(self, firma):
      self.firma = firma
        [...]

    def toString(objekt) -> str:
        result = '"' + objekt.getFirma() + '"\t"' + objekt.getStrasse() + '"\t"' + objekt.getOrt() + '"\t"' + objekt.getPlz() + '"\t"' + objekt.getTelefon() + '"'
        return result

现在,我编写了这段代码来测试我的方法“ createSchreibfehler”是否按照我想要的方式创建了一个错误。

for i in range(100):

    firma = Generator.generateFirma()

    x = firma
    y = firma

    AttributFirma = x.getFirma()
    fehlerString = Szenario.createSchreibfehler(AttributFirma)
    y.setFirma(fehlerString)

    print(Firmendatensatz.Firma.toString(x))
    print(Firmendatensatz.Firma.toString(y))

我得到如下输出:

"Bohlnader" "Lachmannstr. 113"  "Bamberg"   "13669" "01991 351660"
"Bohlnader" "Lachmannstr. 113"  "Bamberg"   "13669" "01991 351660"
or 
"Carsetn"   "Seifertring 139"   "Delitzsch" "64621" "(00423) 19090"
"Carsetn"   "Seifertring 139"   "Delitzsch" "64621" "(00423) 19090"
...

(两个字符串(x和y)都有拼写错误) (要创建我正在使用Faker软件包的Firma)

一切正常,但是当我使用y.setFirma(fehlerString)时,它似乎覆盖了我的x和y。

你们有一个主意,为什么x和y不仅是我的变量x都有错误? 我在JetBrains PyCharm中使用Python 3.7.1

1 个答案:

答案 0 :(得分:0)

您不是通过这样做来创建两个独立的对象

firma = Generator.generateFirma()

x = firma
y = firma

xy是引用相同对象数据的名称。您对x所做的任何更改都是在y也引用的数据上完成的。

使用可变对象时,这是一个典型的初学者错误-大多数情况下是使用列表看到的:

如果不需要访问器方法,请将其删除,它们只会使您的结构复杂化。您可以创建一个简单的clone-ing方法,该方法创建对象的独立实例并使用它:

class Firma:
    def __init__(self, firma, strasse, plz, ort, telefon):
        self.firma = firma
        self.strasse = strasse 
        self.plz = plz
        self.ort = ort
        self.telefon = telefon

    def CloneMe(self):
        """Returns a clone of this object as independent copy."""
        return Firma(self.firma,self.strasse,self.plz,self.ort,self.telefon)


    def __str__(self):
        # default string method so you can simply print() your object-instances
        return f'"{self.firma}"\t"{self.strasse}"\t"{self.plz}"\t"{self.ort}"\t"{  self.telefon}"'

x = Firma("A", "cstr 42", "4444", "NoWhere"," 0123456789")

# clone and change something

y = x.CloneMe()    
y.ort = "Muenchen"     # no need for get/set methods 

print(x, "=>", id(x))
print(y, "=>", id(y))

输出(不同的数据,不同的id):

"A" "cstr 42"   "4444"  "NoWhere"   " 0123456789" => 139652937418232   # x
"A" "cstr 42"   "4444"  "Muenchen"  " 0123456789" => 139652937418288   # y