为什么我的程序会覆盖这两个对象?
Why does my Program override both Objects?
我正在开发一个程序来创建伪造的副本,它在指定的属性中有某种不一致。
我正在使用我的 class "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)都存在拼写错误)
(为了创建一个 Firma,我正在使用 Faker 包)
一切正常,除了当我使用 y.setFirma(fehlerString).
时它似乎覆盖了我的 x 和 y
你们知道为什么 x 和 y 不仅在我的变量 x 中有错误吗?
我在 JetBrains PyCharm
中使用 Python 3.7.1
你不是在创建两个独立的对象
firma = Generator.generateFirma()
x = firma
y = firma
x
和 y
是引用相同对象数据的名称。您对 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))
输出(不同的数据,不同的ids):
"A" "cstr 42" "4444" "NoWhere" " 0123456789" => 139652937418232 # x
"A" "cstr 42" "4444" "Muenchen" " 0123456789" => 139652937418288 # y
我正在开发一个程序来创建伪造的副本,它在指定的属性中有某种不一致。
我正在使用我的 class "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)都存在拼写错误) (为了创建一个 Firma,我正在使用 Faker 包)
一切正常,除了当我使用 y.setFirma(fehlerString).
时它似乎覆盖了我的 x 和 y你们知道为什么 x 和 y 不仅在我的变量 x 中有错误吗? 我在 JetBrains PyCharm
中使用 Python 3.7.1你不是在创建两个独立的对象
firma = Generator.generateFirma() x = firma y = firma
x
和 y
是引用相同对象数据的名称。您对 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))
输出(不同的数据,不同的ids):
"A" "cstr 42" "4444" "NoWhere" " 0123456789" => 139652937418232 # x
"A" "cstr 42" "4444" "Muenchen" " 0123456789" => 139652937418288 # y