2017-04-17 12 views
0

私はまだクラスが新しく、実装しようとしているサブクラスと少し苦労しています。サブクラスのスーパークラスオブジェクトへのアクセス

だから私は、次のような私のNitinクラスを持っている:

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 

私がログインできるとself.sessionlogin()機能がアップデートされ、このステップは、結構です。今私はModelサブクラスを持っています。元の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) 

私は次のように私のメインのコードでこれを行うにしようとしています:

​​

しかし、これは次の例外発生させます:私はworngクラスを理解すると思う

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' 

を。私は実際に次のようにしたいと考えています:

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

しかしこれは可能かどうかわかりません。

答えて

1

私はあなたがやろうとしているものは100%確実ではないけど、エラーがModelはそれを含むことに加えて、Nitinを拡張していることも原因です。これが起こる作るラインがModel以来

class Model(Nitin): 

でもNitinオブジェクトへの参照が含まれている、私はあなたが本当に

class Model(object): 

のようなもののコンストラクタを呼び出そうとしsuper(Model, self).__init__(nitin)行をしたいと思われますスーパークラス。この場合、必要なユーザー名とパスワードの代わりに、1つの引数(nitin)でNitin.__init__が呼び出されています。

この場合、Modelを延長してobjectを呼び出し、super(...).__init__へのコールをすべて削除することをお勧めします。

クラスを拡張するということは、同じコードを再実装することなく、拡張クラスで使用できるすべての属性と機能を持つことを意味します。あなたのコードは、Nitinインスタンス(正しく行っている)への参照を必要としているだけで、それを拡張するのではなく、間違っているようです。

NitinからModelを参照する方法についての質問に答えるために:あなたはModel.__init__への呼び出しでNitin参照としてselfを使用してNitin.__init__内モデルを初期化することができます。あなたはその後、唯一の違いは、あなたがNitinコンストラクタにモデルのURLだけでなく、model属性その事実を渡すだろうとされた状態で、正確にあなたが欲しいのコードを実行する可能性が

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) 

:あなたのNitin.__init__は、次のようになります小文字です:

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

あなたはそれが動作提案された変更を行った後、私はNitin.Model.some_function_from_Model() ''のようなModel'クラスを呼び出すための方法があるかどうかを知りたいのですが '私が持っていた後、ニティンを初期化した。 'Nitin'が初期化され、セッションが作成されたところで、' Model'で作業を続けることができます。 – rhillhouse

+0

@ou_snaaksie。次に、 'Nitin .__ init__'に' self.model'を初期化します。今あなたが外部コードでやっているように 'Model .__ init__'に' self'を渡すことができます。 –

+0

私はかなり理解できません..ごめんなさい。あなたはちょうど言ったことであなたの答えを更新してもよろしいですか?クラスは私を混乱させている – rhillhouse

関連する問題