2017-04-17 1 views
0

Je suis encore novice en matière de cours, et je me bats un peu dans une sous-classe que j'essaie de mettre en œuvre.Accéder aux objets de la superclasse de la sous-classe

J'ai donc ma classe Nitin en tant que tel:

import requests 
from bs4 import BeautifulSoup 


class Nitin(object): 
    def __init__(self, username, password): 
     self.username = username 
     self.password = password 
     self.session = requests.session() 
     self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'} 

    def login(self): 
     self.session.auth = (self.username, self.password) 
     r = self.session.get(self.urls['models']) 
     return self.session 

Cette étape est très bien, comme je peux ouvrir une session et self.session est mises à jour dans la fonction login(). Maintenant, j'ai une sous-classe Model, qui devrait avoir accès à l'original Nitin.session.

class Model(Nitin): 
    def __init__(self, nitin, model): 
     super(Model, self).__init__(nitin) 
     self.model = model 
     self.nitin = nitin 


    def media(self): 
     r = self.nitin.session.get(self.model) 
     print(r.status_code) 
     soup = BeautifulSoup(r.text, 'html.parser') 
     for table in soup.find('div', {'id': 'photobar'}).findAll('table'): 
      print(table) 

J'essaie de le faire dans mon code principal comme suit:

# Imports all Nitin classes 
from src import * 

# Initialize Nitin object 
ripper = Nitin(username='aaaa', password='bbb') 
# Initialize session with u/p 
ripper.login() 

# Initialize Model by passing the Nitin object to it, as well as a link 
model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php') 

Mais cela soulève l'exception suivante:

model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php') 
    File "/home/redact/git/redact/src/Nitin.py", line 32, in __init__ 
    super(Model, self).__init__(nitin) 
TypeError: __init__() missing 1 required positional argument: 'password' 

Je pense que je comprends les classes worng. Je voudrais vraiment faire ce qui suit:

rippper = Nitin(username='aaaa', password='bbbb) 
rippper.login() 
rippper.Model.media() 

Mais je ne sais pas si c'est possible.

Répondre

1

Je ne suis pas 100% sûr de ce que vous essayez de faire, mais l'erreur est due à être le fait que ModelétendNitin en plus de contenir. La ligne qui fait arriver est

class Model(Nitin): 

Depuis Model contient également une référence à un objet Nitin, je soupçonne que vous voulez vraiment quelque chose comme

class Model(object): 

La ligne super(Model, self).__init__(nitin) tente d'appeler le constructeur de la superclasse. Dans ce cas, Nitin.__init__ est appelé avec un argument (nitin) au lieu du nom d'utilisateur et du mot de passe requis.

Je suggère que vous avez Model étendre object et supprimer tous les appels à super(...).__init__ entièrement dans ce cas.

L'extension d'une classe signifie que tous ses attributs et fonctionnalités sont disponibles pour la classe d'extension sans avoir à réimplémenter le même code. Votre code semble avoir juste besoin d'une référence à une instance Nitin (ce que vous faites correctement), pas de l'étendre (ce que vous faites, mais de manière incorrecte).

Pour répondre à votre question sur la façon de faire référence à une Model d'un Nitin: vous pouvez initialiser un modèle au sein Nitin.__init__ utilisant self comme référence Nitin dans l'appel à Model.__init__.Votre Nitin.__init__ ressemblerait à quelque chose comme ceci:

def __init__(self, username, password, model_url): 
    self.username = username 
    self.password = password 
    self.session = requests.session() 
    self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'} 
    self.model = Model(self, model_url) 

Vous pouvez alors exécuter exactement le code que vous voulez, avec la seule différence étant que vous passeriez l'URL du modèle au constructeur Nitin ainsi que le fait que l'attribut model est en minuscule:

rippper = Nitin(username='aaaa', password='bbbb', model_url='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php') 
rippper.login() 
rippper.model.media() 
+0

après avoir effectué les changements que vous proposez cela fonctionne, mais je voudrais savoir s'il y a un moyen d'appeler la classe '' model' comme Nitin.Model.some_function_from_Model() 'après que j'ai initialisé 'Nitin'. Où 'Nitin' est initialisé et la session créée, et je peux juste continuer à travailler avec' Model'. – rhillhouse

+0

@ou_snaaksie. Ensuite, initialisez 'self.model' dans' Nitin .__ init__'. Vous pouvez passer 'self' à' Model .__ init__' comme vous le faites dans le code externe maintenant. –

+0

Je ne comprends pas très bien .. désolé. Pourriez-vous mettre à jour votre réponse avec ce que vous venez de dire? Les cours me confondent – rhillhouse