让Python每次创建一个新实例

2024-04-29 19:17:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个生成数据的类:

class dataGen():

        #class to generate data.

        def firstName():
                firstName = 'Storm' + str(timeGen.timeGen())
                return firstName

        def lastName():
                lastName = 'Trooper' + str(timeGen.timeGen())
                return lastName 

        def randString():
                rint = random.randint(1,20)
                r4ndString = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(rint))
                return r4ndString

        def email():
                EmailA = dataGen.randString() 
                EmailB = dataGen.randString()
                items = ['.com','.net','.org']
                tld = random.choice(items) 
                return str(EmailA) + '@' + str(EmailB) + str(tld)

        def empid(size=20, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits):
                return ''.join(random.choice(chars) for _ in range(size))   

        def ssnGen():
                ssnGenD = random.randint(100000000,999999999)
                return ssnGenD

发出SQL调用的类:

^{pr2}$

…我有一个类根据SQL查询的结果调用它。在

^{3}$

我的主回路

def main():

        datagenInstance = dataGen()
        SQLConnInstance = sqlConn()  
        CLIENT, filename, FILESTRUCT = selectFile()
        PARSED = parse(filename)
        HOLDERLIST = holderClass(PARSED, FILESTRUCT)
        deIDedData = deID(HOLDERLIST)
        deIDedFile = merge(PARSED, deIDedData, FILESTRUCT)
        fileExport(filename, deIDedFile)

if __name__ == '__main__':

    main()

HOLDERLIST只是一个CSV文件,它被解析为4个字符串的列表。我遇到的问题是,SQL连接类和dataGen类不是每次都进行新的调用。每次循环运行时,它都应该为前面提到的两个类创建一个新实例。我知道在像c#和c++这样的语言中,我可以在调用的前面加上new,以强制语言在每次被调用时都创建一个新实例。我读过关于在python中使用new之类的东西的文献,但是这些东西似乎被放在类声明中,我对python的类修饰并不是很了解。在


Tags: sqlstringreturnmaindefasciirandomfirstname
1条回答
网友
1楼 · 发布于 2024-04-29 19:17:43

似乎您对Python中的类不太熟悉。您已经创建了两个只包含类方法而不包含实例属性的类。要将您的dataGen类更新为基于实例,您可以使用类似以下内容:

class DataGen(object):
    def __init__(self):
        self.first_name = 'Storm' + str(timeGen.timeGen())
        self.last_name = 'Trooper' + str(timeGen.timeGen())
        self.email = DataGen.rand_email()
        self.empid = DataGen.rand_empid()
        self.ssn = DataGen.rand_ssn()

    @staticmethod
    def rand_string():
        r_int = random.randint(1,20)
        r_string = ''.join(random.choice(string.ascii_uppercase + 
                         string.ascii_lowercase + string.digits) 
                    for _ in range(r_int))
        return r_string

    @staticmethod
    def rand_email():
        email_a = DataGen.rand_string() 
        email_b = DataGen.rand_string()
        items = ['.com','.net','.org']
        tld = random.choice(items) 
        return str(email_a) + '@' + str(email_b) + str(tld)

    @staticmethod
    def rand_empid(size=20, chars=string.ascii_uppercase + 
                                string.ascii_lowercase + string.digits):
        return ''.join(random.choice(chars) for _ in range(size))

    @staticmethod
    def rand_ssn():
        ssn = random.randint(100000000,999999999)
        return ssn

当一个类的实例被创建时,__init__函数被调用并被用来实例化类(这通常意味着设置实例属性)。所有实例方法都隐式传递参数self,这是类的实例。decorator staticmethod重写此行为,当调用这些方法时,不会隐式传递任何参数。创建实例并访问其属性是直接的。在

^{pr2}$

但是,当您在主循环中创建datagenInstance时,它不会在任何地方使用。您需要将它传递给相关函数。很难提供比这更多的指导,因为您可能需要重新构造许多代码。This link可以帮助您更好地解释类。在

相关问题 更多 >