2016-05-10 3 views
0

У меня есть класс, чтобы генерировать данные:Получение 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 вызова:

class sqlConn(): 

     #Class to handle all SQL connections 

     def realEmail(cEmail): 
       cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=Dev1SQL1;DATABASE=TimeCurrent;Trusted_Connection=yes') 
       cursor = cnxn.cursor() 
       sql = 'exec tbl.usp_Lookup_Email "%s"' % cEmail 
       cursor.execute(sql) 
       data = cursor.fetchall() 
       return(data) 

     def realEmpID(cEmpID): 
       cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=Dev1SQL1;DATABASE=TimeCurrent;Trusted_Connection=yes') 
       cursor = cnxn.cursor() 
       sql = 'exec tbl.usp_Lookup_EmplID "%s"' % cEmpID 
       cursor.execute(sql) 
       data = cursor.fetchall() 
       return(data)     

     def realEmpName(cFName, cLName): 
       cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=Dev1SQL1;DATABASE=TimeCurrent;Trusted_Connection=yes') 
       cursor = cnxn.cursor() 
       value = (cFName, cLName) 
       sql = 'exec tbl.usp_Lookup_Name "%s", "%s"' % value     
       cursor.execute(sql) 
       data = cursor.fetchall() 
       return(data) 

     def realSSN(cSSN): 
       cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=Dev1SQL1;DATABASE=TimeCurrent;Trusted_Connection=yes') 
       cursor = cnxn.cursor() 
       sql = ' exec tbl.usp_Lookup_SSN "%s"' % cSSN 
       cursor.execute(sql) 
       data = cursor.fetchall() 
       return(data) 

... и у меня есть класс, который звонит что основано на результатах моего SQL-запроса.

def deID(HOLDERLIST): 
     #Takes in the holderList from holderClass, checks aganst the database to see if the fakeFeild for each of the values has data, 
     #If the feild does not return none, it uses that data. If it is none, then it generates new data. 
     for item in HOLDERLIST: 
       for idx, lis in enumerate(item):       
         if idx == 0: 
           fName = item[0] 
           lName = item[1] 
           name = sqlConn.realEmpName(fName, lName) 
           if name == None: 
             item[0] = dataGen.firstName() 
             item[1] = dataGen.lastName() 

           else: 
             item[0] = name[0][0] 
             item[1] = name[0][1] 

         elif idx == 2: 
           SSN = sqlConn.realSSN(item[idx]) 
           if SSN == None: 
             item[idx] = dataGen.ssnGen()           
           else: 
             item[idx] = SSN           

         elif idx == 3: 
           email = sqlConn.realEmail(item[idx]) 
           if email == None: 
             item[idx] = dataGen.email() 
           else: 
             item[idx] = email          


     print('Holderlist deID')   
     return(HOLDERLIST) 

Мой Главный цикл

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++, я могу прикрепить новый к фронту вызова, чтобы заставить язык создавать новый экземпляр каждый раз, когда он вызывается. Я прочитал литературу об использовании таких вещей, как в python, но похоже, что это помещено в объявление класса, и я действительно не очень хорошо разбираюсь в классах класса python.

+1

Почему все эти классы? Вы не делаете ни одного экземпляра этих классов в любом месте, и ни один из методов не будет использовать какое-либо состояние экземпляра или работать с экземпляром вообще, если вы это сделали. – user2357112

+0

Извините, забыли связать мой основной цикл. Вопрос отредактирован. –

ответ

2

Кажется, что вы не слишком хорошо знакомы с классами на 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, который является экземпляром класса. Декоратор staticmethod переопределяет это поведение, и, когда эти методы вызывают, параметры не будут передаваться неявно. Создание экземпляра и доступ к его атрибутам прямолинейны.

instance = DataGen() 

print(instance.first_name) # Storm8 
print(instance.last_name) # Trooper6 
print(instance.email) # [email protected] 
print(instance.empid) # JhPGpnwUQlm9tCaWbW3F 
print(instance.ssn) # 370469583 

Однако при создании datagenInstance в главном цикле, он не используется в любом месте. Вам нужно передать его соответствующим функциям. Трудно предложить гораздо больше рекомендаций, чем это, так как вам, вероятно, потребуется перестроить много кода. This link может помочь вам лучше объяснить классы.

+0

Если я правильно понимаю это, как классы работают в python, мне нужно явно ссылаться на ссылку каждого метода каждый раз при вызове класса (self.methodname)? Затем я просто вызываю ссылку на класс, которую я создаю в своей основной()? –

+0

@AddisonWilson Нет, вы, вероятно, захотите создать новый экземпляр в своем основном цикле и обновить 'deID', чтобы принять второй параметр' DataGen_insance'. –

+1

@AddisonWilson Или, может быть, нет, это действительно неясно, что вы пытаетесь сделать. Вам нужно создавать экземпляры вообще? Если да, то какую информацию вы хотите инкапсулировать в экземпляр? –

Смежные вопросы