【问题标题】:Instance variable updating every time object is called [closed]每次调用对象时更新实例变量[关闭]
【发布时间】:2021-08-09 04:34:04
【问题描述】:

我正在尝试创建一个使用随机生成的字符串作为每个实例的 id 的类,该实例稍后将在另一个类中继承。下面是我正在做的一个简化版。

class Part():

    def __init__(self, type):
        import random
        import string

        self.type = type

        # Generate instance ID
        self.part_serial = ''.join(random.choice(string.ascii_lowercase + string.digits) for i in range (8))

class Assembly():

    def __init__(self, Part):
        import random
        import string

        # Input agruments
        Part.__init__(self)

        # Use inherited part_serial
        self.assembly_serial = Part.part_serial + "-" + ''.join(random.choice(string.ascii_lowercase + string.digits) for i in range (8))

问题是一旦我创建了部件,每次调用对象时,id 都会发生变化。有没有什么方法可以使用类似的东西创建一个实例变量,每次调用对象时都不会改变?

test_part = Part("A")
print(test_part.part_serial) # Returns 5347c17a

test_assembly = Assembly(test_part) # Returns fda8721d-47b6c677 but should return 5347c17a-xxxxxx

【问题讨论】:

  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。另外,我不知道您所说的“调用零件”是什么意思-您调用了函数或方法;对象不可调用。
  • 道歉。我还是编程新手,还不知道如何使用该术语。我将代码 sn-p 更新为工作示例。这是我遇到的问题的一个粗略示例。我发现了一些属性,我可以使用 UUID 并且每次引用对象时它都不会改变(希望这是正确的术语)但不是全部。有些人需要在代码 sn-p 中使用带有 ''.join() 的 for 循环。
  • 编辑:UUID 不像我想象的那样工作。

标签: python inheritance uuid instance-variables


【解决方案1】:

错误就在Assembly初始化中:

def __init__(self, Part):

    # Input agruments
    Part.__init__(self)

出于某种奇怪的原因,您明确地重新初始化了 Part。这会生成一个新的零件编号。你为什么这样做?对于任何对象,__init__ 只应在其初始创建时调用一次,并且永远不会再次调用。从Assembly 中删除它。此外,请继续通过课堂示例来学习结构和流程。


注意import 语句属于文件顶部。 每次创建新对象时,您的代码都会重复imports,这几乎总是浪费时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多