如何在Python中的方法之间传递变量?

时间:2019-11-06 04:21:11

标签: python

我是初学者。我写了一些代码,现在试图将它们组织到方法中,但是我完全不了解Python如何在方法之间进行通信。我的代码概述如下: pseudocode

注意,所有东西放在一起时都可以正常工作,但是现在我无法将数组从方法1转移到方法2。无论我做什么,总是无法定义某些内容。另外,运行第二种方法总是需要更多的参数,我不明白。 现在,我下面的当前代码正在返回:

  

NameError:名称'csvGet'未定义

if __name__ == "__main__":
# Ask for csv file path and define
file_in = input('READ FILE: ')
# Get browser driver path
chromeDriver_Path = '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/chrome/chromedriver'

class App:  
    def __init__(self, file_in):
        # Initialize csv file path
        self.file_in = file_in
        # Initialize browser driver path
        self.chromeDriver_Path = chromeDriver_Path

    # Inject csv file
    def csvGet(self):
        # Declare array for urls
        urls = []
        # Open csv file from path
        with open(file_in, 'r') as f:
            # Read csv file
            reader = csv.reader(f)
            # Add each row in column 11 of csv to urls array
            for row in reader:
                urls.append(row[11])
        # Skip first row in array
        urls = urls[1:]
        # Return the array
        return urls

    # Run automatic browser
    def goBrowser(self):
        options = webdriver.ChromeOptions()
        chrome_options = Options()
        browser = webdriver.Chrome(chromeDriver_Path, chrome_options=options)

        # Get array from other method
        urls = csvGet(urls)

        cnt = 0

        for link in urls:
            cnt += 1
            browser.get(link)
            # Do more stuff...

        browser.quit()

     goBrowser(csvGet)

像我五岁一样向我解释:我在做什么错了?

2 个答案:

答案 0 :(得分:1)

App是一个class,因此,您需要创建一个App实例并调用其方法,而不是goBrowser(csvGet)

app = App()
app.goBrowser()

第二,在goBrowser()函数中,您需要调用csvGet()。同样,由于它在类中,因此您需要以下语法:

self.csvGet()

基本上,self是一个传递给每个方法的特殊参数-当您调用app.goBrowser()时,它将调用goBrowser(),并传递self=app。在其他面向对象的语言(例如C ++或C#)中,此功能是隐藏的,但在Python中,则是公开的。

编辑:也正如shaik moeed所说,csvGet()缺少urls参数,即。

def csvGet(self, urls):
    pass

...
self.csvGet(urls)

答案 1 :(得分:0)

self最适合在使用面向对象的编程时传递任何类型的变量 像这样的代码:     如果名称 ==“ 主要”:     file_in = input('READ FILE:')chromeDriver_Path ='/ Library / Frameworks / Python.framework / Versions / 3.7 / lib / python3.7 / site-packages / selenium / webdriver / chrome / chromedriver'

class App:  
    def __init__(self, file_in, screenshotFolder):
    # Initialize csv file path
    self.file_in = file_in
    # Initialize browser driver path
    self.chromeDriver_Path = chromeDriver_Path

    # Inject csv file
    def csvGet(self):
        # Declare array for urls
        urls = []
        # Open csv file from path
        with open(file_in, 'r') as f:
            # Read csv file
            reader = csv.reader(f)
            # Add each row in column 11 of csv to urls array
            for row in reader:
                urls.append(row[11])
        # Skip first row in array
        urls = urls[1:]
        # Return the array
        return urls

    # Run automatic browser
    def goBrowser(self):
        options = webdriver.ChromeOptions()
        chrome_options = Options()
        browser = webdriver.Chrome(chromeDriver_Path, chrome_options=options)

        # Get array from other method
        urls = self.csvGet(urls)

        cnt = 0

        for link in urls:
            cnt += 1
            browser.get(link)
            # Do more stuff...

        browser.quit()

     goBrowser(self)
相关问题