【问题标题】:Passing type/class instance as argument to class constructor?将类型/类实例作为参数传递给类构造函数?
【发布时间】:2019-09-29 15:27:18
【问题描述】:

我开始在 python 中开发一些代码(有一些 C 和 C++ 经验),但我无法理解如何将特定类型传递给另一个类的构造函数。考虑这个例子:

class baseClass(object):
    def __init__(self,x,y):
        self.x = x
        self.y = y

class myClass(object):
    def __init__(self, otherClass,size):
        self.myMember = [otherClass] * size 

    def addMemberInstance(self,otherClass):
        self.myMember.append(otherClass)

    def setOtherClassX(self,pos,x):
        self.myMember[pos].x = x

    def getOtherClassX(self,pos):
        return self.myMember[pos].x

    def printMemberXs(self):
        print("----")
        for m in self.myMember:
            print(m.x)
        print("----")

# populate myClass myMember list with 10 instances of baseClass
foo = myClass(baseClass(5,6),10)  
foo.printMemberXs()

# change atribute of myMember entry at pos 3 with val 16
foo.setOtherClassX(3,16)
foo.printMemberXs() # apparently all entries in the list are changed

# append a new entry to myMember with a new instance of baseClass
foo.addMemberInstance(baseClass(3,7))
foo.printMemberXs()

# change atribute of new myMember entry (at pos 10) with val 47
foo.setOtherClassX(10,47)
foo.printMemberXs() #only the last entry was changed!

我尝试这样做的原因是我将有几个从baseClass 派生的类,并希望将类型/构造函数/实例传递给myClass 构造函数。我对创建预定义大小列表或仅单独附加每个条目之间的区别感到特别困惑?

【问题讨论】:

  • 部分问题在于 myObject 的构造函数创建了对单个 baseClass 实例的引用的大小副本。
  • this 帖子。虽然列表是可变的,但指针可能指向同一个对象
  • 你想要inheritance,阅读Python - Object Oriented
  • @AndrewAllen 我认为这仅涵盖了我在初始实例化后更改列表的尝试,因此我仍在尝试为myClass__init__ 方法找到一种方法来填充列表baseClass的不同副本?

标签: python list class object arguments


【解决方案1】:

在进行这些更改后得到你的样子:

class myClass(object):
    def __init__(self, instances):  # parameter of a list of separate instances
        self.myMember = instances
    # rest of members

foo = myClass([baseClass(5,6) for _ in range(10)])  # Make a list with 10 distinct instances
# rest of program here

【讨论】:

  • 它似乎确实有效,但有没有办法获得更清晰的语法?我试图将循环放在__init__(即self.myMember= [instances for _ in range(10)])中,但它似乎不起作用。
  • 您再次复制引用,而不是创建新实例。
  • 那么就没有办法从特定引用实例化一个新对象了吗?
  • 你需要一个工厂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多