IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Questions diverses : héritage et package


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2006
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2006
    Messages : 240
    Par défaut Questions diverses : héritage et package
    Bonjour à tous

    Bon étant en cours d'auto-formation sur le langage je suis un peu bloquer depuis 2 jours sur 2 problématiques :

    - J'essaye de faire un héritage de classe, mais j'obtiens le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Browser(webdriver):
    	def GetElement(self):
    		webdriver.
    		print 'toto'
    Message obtenu :
    class Browser(selenium.webdriver):
    TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)
    Quelqu'un pourrais m'expliqué ce message ?

    - En ce qui concerne les packages, J'aimerais organisé mes fichiers de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ElementPackage
          Fichier1.py qui contient classe toto
          Fichier2.py qui contient classe tata
          __init__.py 
    Main.py
    Main.py utilise toto et tata je lui est donc mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    From ElementPackage import *
    __init.py__ contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import Fichier1, Fichier2
    Mais cela ne fonctionne pas, la démarche est elle bonne ou non ?

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Mais cela ne fonctionne pas, la démarche est elle bonne ou non ?
    Non, mais je ne connais pas webdriver et donc je ne peux pas t'annoncer plus que ci-dessous et son initialisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Browser(webdriver):
            def __init__(self): # constructeur de l'objet Browser
                webdriver.__init__(self, ...) # Appel du constructeur webdriver
                # tous tes paramètres d'initialisation
    	def GetElement(self):
    		webdriver.
    		print 'toto'
    Pour avoir un code plus précis, il faudra plus de précision.

  3. #3
    Membre très actif
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2006
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2006
    Messages : 240
    Par défaut
    Merci Fred pour ta réponse.

    Webdriver est une classe issu du package Selenium que j'ai ajouter dans mon install python 2.7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Browser(webdriver):
            def __init__(self): # constructeur de l'objet Browser
                webdriver.__init__(self, ...) # Appel du constructeur webdriver
                # tous tes paramètres d'initialisation
    	def GetElement(self):
    		webdriver.
    		print 'toto'
    J'ai déjà tenter un truc du genre mais ... webdriver ne contient de fichier méthode __init__

    Je te fais voir ton mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver.common.keys import Keys
    import time
    import selenium
     
     
     
    class Browser(webdriver):
            def __init__(self): # constructeur de l'objet Browser
                print 'toto' # Appel du constructeur webdriver
     
    class WebPage(object):
        '''
        classdocs
        '''
        def __init__(self):
            '''
            Constructor
            '''
     
     
     
    if __name__ == "__main__":
        TestBrowser = Browser.Firefox()
        TestBrowser.get("http://www.yahoo.com") # Load page
        assert "Yahoo!" in TestBrowser.title
        elem = TestBrowser.find_element_by_name("p") # Find the query box
        elem.send_keys("seleniumhq" + Keys.RETURN)
        time.sleep(0.2) # Let the page load, will be added to the API
        try:
            TestBrowser.find_element_by_xpath("//a[contains(@href,'http://seleniumhq.org')]")
        except NoSuchElementException:
            assert 0, "can't find seleniumhq"
        TestBrowser.close()
    et le message que j'obtiens exact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Traceback (most recent call last):
      File "/home/benoit/workspace/IntelliTest/src/HTMLDataCollection.py", line 10, in <module>
        class Browser(webdriver):
    TypeError: Error when calling the metaclass bases
        module.__init__() takes at most 2 arguments (3 given)
    firefox est une méthode de la classe webdriver.

    J'avoue ne pas du tout maitrisé ce que je fais (et ça m'énerve ... mais ça me motive a trouver aussi )

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    J'ai déjà tenter un truc du genre mais ... webdriver ne contient de fichier méthode __init__
    Il y a toujours un constructeur, sans argument peut-être, mais en général oui.

    Tu peux tester ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from selenium import webdriver
     
    class Browser(webdriver):
            def __init__(self): # constructeur de l'objet Browser
                webdriver.__init__(self) # Appel du constructeur webdriver
                # tous tes paramètres d'initialisation
    	def GetElement(self):
    		self.Firefox()
    		print 'toto'
     
    firefox = Browser()
    firefox.GetElement()
    Voilà non testé, mais ça devrait quasiment être fonctionnel, à moins d'une inattention

  5. #5
    Membre très actif
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2006
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2006
    Messages : 240
    Par défaut
    j'ai créer un nouveau fichier pour tester ton code, j'obtiens le message ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Traceback (most recent call last):
      File "/home/benoit/workspace/IntelliTest/src/test.py", line 3, in <module>
        class Browser(webdriver):
    TypeError: Error when calling the metaclass bases
        module.__init__() takes at most 2 arguments (3 given)
    Je suis d'accord sur le principe du constructeur, j'ai donc regarder le package selenium
    voici la structure (les mot en rouge représente des packages) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Selenium
            webdriver
            __init__.py
    selenium.py
    __init__.py
    le fichier __init__.py de webdriver contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    from firefox.webdriver import WebDriver as Firefox
    from firefox.firefox_profile import FirefoxProfile
    from chrome.webdriver import WebDriver as Chrome
    from ie.webdriver import WebDriver as Ie
    from remote.webdriver import WebDriver as Remote
    from common.desired_capabilities import DesiredCapabilities
    from common.action_chains import ActionChains
    le fichier __init__.py de selenium contient la classe selenium

    Pour infos, mes tentives font suite a cette exemple qui est fonctionnel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver.common.keys import Keys
    import time
     
    browser = webdriver.Firefox() # Get local session of firefox
    browser.get("http://www.yahoo.com") # Load page
    assert "Yahoo!" in browser.title
    elem = browser.find_element_by_name("p") # Find the query box
    elem.send_keys("seleniumhq" + Keys.RETURN)
    time.sleep(0.2) # Let the page load, will be added to the API
    try:
        browser.find_element_by_xpath("//a[contains(@href,'http://seleniumhq.org')]")
    except NoSuchElementException:
        assert 0, "can't find seleniumhq"
    browser.close()
    Je tente de te donner le maximun d'info mais ... je ne sais pas si cela t'aide

  6. #6
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Ben, t’as pas bien lu le code que je proposais. Ce n’est pas
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    class Browser(webdriver):
    …qu’il faut écrire, mais
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    class Browser(webdriver.WebDriver):

    Ton code fait hériter Browser du module webdriver, et pas de la classe WebDriver (vérifie quand même, dans le code de selenium, que cette classe «*de base*» est bien nommée ainsi, et bien accessible depuis le module webdriver…)*!

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il y a toujours un constructeur, sans argument peut-être, mais en général oui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class foo(object):
        @staticmethod
        def bar(): print 'bar'
     
    f=foo()
    f.bar()

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je disais en général josmiley

    Je n'ai pas voulu aborder d'autres points un peu plus technique de la POO.

    Surtout que ce n'est pas vraiment ce que demande le PO

    @ben_ghost

    Tu devrais voir les bases de la POO avant de te lancer dans des difficultés comme l'héritage, ça t'aidera à mieux comprendre l'héritage par la suite.

  9. #9
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Oula, mais webdriver, c’est un module, pas une classe*! Si*?

    J’imagine que la classe, c’est webdriver.Webdriver, non*?

    Donc, ton code devrait être*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver.common.keys import Keys
    import time
    import selenium
     
     
    class Browser(webdriver.Webdriver):
            def __init__(self): # constructeur de l'objet Browser
                print 'toto' # Appel du constructeur webdriver

    Quant à ta deuxième question, il me semble qu’en l’état actuel de ton code, tu devrais accéder à toto et tata avec*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    From ElementPackage import *
    to = Fichier1.toto()
    ta = Fichier2.tata()

    Si tu veux récupérer directement toto et tata dans ton espace de nom avec un from ElementPackage import *, tu peux, au choix*:

    * Le faire à l’import, moyennant quelques lignes supplémentaires*:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    From ElementPackage import *
    toto = Fichier1.toto
    tata = Fichier2.tata
    to = toto()
    ta = tata()

    * Importer dans l’espace de nom de ton fichier ElementPackage/__init__.py le contenu de Fichier1 et Fichier2*:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from Fichier1 import *
    from Fichier2 import *

    Pour finir, note que cette forme d’import (from <package> import *) n’est pas trop conseillée, mieux vaut utiliser les «*chemins*» complets, même si c’est plus verbeux, ou alors explicitement inclure ce que l’on cherche, genre*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    From ElementPackage import Fichier1, Fichier2
    toto = Fichier1.toto
    tata = Fichier2.tata
    to = toto()
    ta = tata()

    ou encore*:
    *ElementPackage/__init__.py*:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from Fichier1 import toto
    from Fichier2 import tata
    Puis…
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    From ElementPackage import toto, tata
    to = toto()
    ta = tata()

    Voilà, j’espère que je n’ai pas été trop long (et que je n’ai pas dit trop de c…ries )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Questions diverses sur les packages
    Par Stief dans le forum Mise en forme
    Réponses: 1
    Dernier message: 15/10/2006, 11h35
  2. [DW8] Questions diverses sur le logicie
    Par syn_42 dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 01/03/2006, 17h23
  3. Petites questions diverses
    Par Fouflarage dans le forum Débuter
    Réponses: 7
    Dernier message: 29/11/2005, 13h43
  4. Questions diverses sur TIBDataset et TDBGrid
    Par AlexB59 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/11/2005, 17h14
  5. Question d'héritage : Overload ou reintroduce ?
    Par LadyWasky dans le forum Langage
    Réponses: 9
    Dernier message: 31/10/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo