Python 3.x Python-可以在线程中调用同一类两次(或更多)?

Python 3.x Python-可以在线程中调用同一类两次(或更多)?,python-3.x,class,python-multithreading,Python 3.x,Class,Python Multithreading,我不太理解python中的类逻辑,但无法在web上回答。 我已创建一个类来生成人员信息: class person: def fristnameGen(gender): ... def emailGen(firstname,surname): ... 我创建了一个bot来这样称呼它: from person import * class bots: def __init__(self): self.p

我不太理解python中的类逻辑,但无法在web上回答。 我已创建一个类来生成人员信息:

class person:  
    def fristnameGen(gender):
        ...
    def emailGen(firstname,surname): 
        ...
我创建了一个bot来这样称呼它:

from person import *
class bots:
    def __init__(self):        
        self.person = person()
    def createDB(self):
        print(self.person.name)
        #do something...
最后我用一个带线的按钮来称呼它

from bots import *
import threading
class Panel:
    def __init__(self):
        self.top = tk.Tk()
        self.bot = bots()
        self.buildUI()

    def foo(self):
        self.bot.createDB(self.stringPhone.get())

    def threadTheAction(func, *args):
        t = threading.Thread(target=func, args=args) 
        t.setDaemon(True) 
        t.start()

    def buildUI(self):
        Button = tk.Button(self.top, text ="Start", command = lambda :self.threadTheAction(self.foo))
我得到这个错误:

TypeError: 'Panel' object is not callable
然而,我直接称之为它的工作

        Button = tk.Button(self.top, text ="Start", command = lambda :self.foo())
如何修复错误? ... 2.此外,我尝试创建
p1=person()
p2=person()
并打印它。发现
p1
p2
是同一个人,我希望每个新的a类都有一个新的。如何使用类生成“新人”


谢谢

您似乎对Python中的面向对象编程有很多困惑。有些方法具有
self
参数,有些则没有,似乎是随机的。这就是您当前错误的来源

Panel
类中的
threadTheAction
方法正在获取作为其第一个参数传入的
Panel
实例,但该实例在方法中命名为
func
(因为您省略了
self
)。作为参数传递的实际函数会在变量参数
*args
中捕获。当线程尝试调用它失败时,会出现异常。在
func
之前添加
self
可以解决当前的问题:

def threadTheAction(self, func, *args):
我怀疑,如果你的代码更进一步,你会在参数列表中没有
self
的其他方法中遇到其他错误。例如,您在
person
中显示的任何方法都不可能正常工作


至于你的第二个问题,你没有展示足够的
person
来了解发生了什么,但是你可能在某种程度上把实例变量做错了。由于方法中没有
self
参数,这几乎是不可避免的(因为您将
self.which
指定给当前实例以设置
which
属性)。如果您需要帮助解决这个问题,我建议您单独问一个问题(当每个问题都是独立的时,堆栈溢出是最好的),并为您的
person
类提供完整的代码。

您似乎对Python中的面向对象编程有很多困惑。有些方法具有
self
参数,有些则没有,似乎是随机的。这就是您当前错误的来源

Panel
类中的
threadTheAction
方法正在获取作为其第一个参数传入的
Panel
实例,但该实例在方法中命名为
func
(因为您省略了
self
)。作为参数传递的实际函数会在变量参数
*args
中捕获。当线程尝试调用它失败时,会出现异常。在
func
之前添加
self
可以解决当前的问题:

def threadTheAction(self, func, *args):
我怀疑,如果你的代码更进一步,你会在参数列表中没有
self
的其他方法中遇到其他错误。例如,您在
person
中显示的任何方法都不可能正常工作


至于你的第二个问题,你没有展示足够的
person
来了解发生了什么,但是你可能在某种程度上把实例变量做错了。由于方法中没有
self
参数,这几乎是不可避免的(因为您将
self.which
指定给当前实例以设置
which
属性)。如果你需要帮助来解决这个问题,我建议你问一个单独的问题(当每个问题都是独立的时,堆栈溢出是最好的),并为你的
人提供完整的代码。

谢谢你!对于threadTheAction,这是一个错误,因为我从另一篇关于堆栈溢出的文章中复制,但在我的类中忘记了它的方法,我三天内都没有办法修复它!对于第二个问题,我想自己花更多的时间来修复它,如果仍然无法修复,我会稍后再问。非常感谢。谢谢你,布莱克特!对于threadTheAction,这是一个错误,因为我从另一篇关于堆栈溢出的文章中复制,但在我的类中忘记了它的方法,我三天内都没有办法修复它!对于第二个问题,我想自己花更多的时间来修复它,如果仍然无法修复,我会稍后再问。非常感谢。