在类中添加动态函数;python

在类中添加动态函数;python,python,python-3.x,closures,metaprogramming,dynamic-programming,Python,Python 3.x,Closures,Metaprogramming,Dynamic Programming,目标是拥有 """pip install selenium""" import os, time, subprocess, random from functools import wraps from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.select import Select class WebdriverC

目标是拥有

"""pip install selenium"""

import os, time, subprocess, random

from functools import wraps

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select


class WebdriverChauffuer(object):

    def __init__(self, username=None, password=None, start_url=None):
        self.username = username
        self.password = password
        self.start_url = start_url

    def quit(self):
        self.driver.quit()

    def restart_driver(self):
        self.driver.quit()
        self.start_driver()

    def get(self, url):
        self.driver.get(url)

    def maximize_window(self):
        self.driver.maximize_window()



class FirefoxDriver(WebdriverChauffuer):

    def __init__(self, username=None, password=None, start_url=None, driver=None):
        super(FirefoxDriver, self).__init__(username=username, password=password, start_url=start_url)
        self.start_driver()

    def start_driver(self):
        self.driver = webdriver.Firefox()
那你就可以了

class WebdriverChauffuer(object):

    def __init__(self, username=None, password=None, start_url=None):
        self.username = username
        self.password = password
        self.start_url = start_url

    def quit(self):
        self.driver.quit()

    def restart_driver(self):
        self.driver.quit()
        self.start_driver()

    def generate_methods(self):
        funcs = ['get', 'maximize_window']
        # makes get and maximize_window
这是有希望的,但没有成功

类驱动程序(对象):
通过
类FuncTester(对象):
定义初始化(自):
self.driver=driver()
self.generate_实例_方法()
def make_方法(自身、名称):
def_方法(自):
getattr(self.driver,name)(*args,**kwargs)
返回法
def生成_实例_方法(自身):
函数=['get','maximize_window']
对于函数中的名称:
_method=self.make_方法(名称)
setattr(self,name,_方法)
在[11]中:f=FuncTester()
In[12]:f.driver
f、 司机
在[12]中:f.driver。
文件“”,第1行
f、 司机。
^
SyntaxError:无效语法
In[13]:f.driver.get
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1 f.司机,上车
AttributeError:“Driver”对象没有属性“get”

为什么不这样将Selenium驱动程序对象传递给FuncTester:

class Driver(object):
    pass


class FuncTester(object):

    def __init__(self):
        self.driver = Driver()
        self.generate_instance_methods()

    def make_method(self, name):
        def _method(self):
            getattr(self.driver, name)(*args, **kwargs)
        return _method

    def generate_instance_methods(self):
        FUNCTIONS = ['get', 'maximize_window']
        for name in FUNCTIONS:
            _method = self.make_method(name)
            setattr(self, name, _method)



In [11]: f = FuncTester()

In [12]: f.driver
f.driver

In [12]: f.driver.
  File "<ipython-input-12-9e167ce57f62>", line 1
    f.driver.
             ^
SyntaxError: invalid syntax


In [13]: f.driver.get
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-7e99453babae> in <module>()
----> 1 f.driver.get

AttributeError: 'Driver' object has no attribute 'get'
FUNCTIONS = ['get', 'maximize_window']
我不是100%确定这会起作用,我也不是在安装了selenium的计算机上,但我认为这会起作用。只需传递webdriver对象

然后,当您这样做时:

class FuncTester(webdriver)
尝试:

但是,我会小心不要像您离开时那样用自己的函数覆盖Selenium Webdriver函数

f.get()
在你的代码中

那么对于这样的事情:

class Driver(object):
    pass


class FuncTester(object):

    def __init__(self):
        self.driver = Driver()
        self.generate_instance_methods()

    def make_method(self, name):
        def _method(self):
            getattr(self.driver, name)(*args, **kwargs)
        return _method

    def generate_instance_methods(self):
        FUNCTIONS = ['get', 'maximize_window']
        for name in FUNCTIONS:
            _method = self.make_method(name)
            setattr(self, name, _method)



In [11]: f = FuncTester()

In [12]: f.driver
f.driver

In [12]: f.driver.
  File "<ipython-input-12-9e167ce57f62>", line 1
    f.driver.
             ^
SyntaxError: invalid syntax


In [13]: f.driver.get
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-7e99453babae> in <module>()
----> 1 f.driver.get

AttributeError: 'Driver' object has no attribute 'get'
FUNCTIONS = ['get', 'maximize_window']
只要做:

def restart_driver(self):
    self.driver.quit()
    self.start_driver()

我明天考试,泰。我的朋友说问题在于我没有更新名称空间(这是一个类,我看到的大多数答案只是生成函数)。有一个关于更新名称空间的答案很复杂,但可读性很强,可以通过谷歌搜索python动态声明函数。我明天查一下,然后更新OK!让我知道它是否有效,我想不出还有什么其他的atm,因为它已经晚了,但我认为在你们班上实现webdriver就可以了。
def restart_driver(self):
    self.quit() //This got changed!
    self.start_driver()