2016-04-11 10 views
-7

Wie man Selbst instence in wenigen Unterklassen mit einige Code wie dieses:ein Selbst für die Klasse in der Klasse

class User(object): 

    def __init__(self) 
     self.user_session = Session() 

    def wallet_sum(self): 
     self.user_session.get('current wallet sum') 

    class Action(object): 

     def __init__(self): 
      self.user_session = User.user_session 

     def buy_dog(self): 
      self.user_session.post('buy_dog') 

    class Listing(object) 

     def my_dogs(self): 
      self.user_session.get('all_my_dogs') 

user = User() 

user.Action.buy_dog() 

user.Listing.my_dogs() 

ich will mit einem selbst ein Benutzerobjekt erstellen und einige Aktionen mit ihm

zu tun

ich versuche:

user.Action().my_dogs() 
AttributeError: type object 'User' has no attribute 'user_session ' 


user.Action.my_dogs() 
TypeError: Action() missing 1 required positional argument: 'self' 
+5

Was möchten Sie erreichen, indem Sie zwei Klassen in eine andere einfügen? – jwodder

Antwort

3

Sie nur innerhalb des Namensraumes der Klasse definierten Klassen User. Eine Instanz von User hat keine magischen Instanzen der inneren Klassen (d. H. In Python gibt es nichts wie eine innere Klasse). Daher sind Klassendefinitionen in anderen Klassen normalerweise nicht sinnvoll.

Sie haben den anderen Klassen einen ausdrücklichen Hinweis auf Ihre user Objekt geben:

class User(object): 
    def __init__(self) 
     self.user_session = Session() 
     self.action = Action(self) 
     self.listing = Listing(self) 

    def wallet_sum(self): 
     self.user_session.get('current wallet sum') 

class Action(object): 
    def __init__(self, user): 
     self.user_session = user.user_session 

    def buy_dog(self): 
     self.user_session.post('buy_dog') 

class Listing(object) 
    def __init__(self, user): 
     self.user = user 

    def my_dogs(self): 
     self.user.user_session.get('all_my_dogs') 

user = User() 
user.action.buy_dog() 
user.listing.my_dogs() 
+0

Große Antwort, Daniel. Für alle Neugierigen ist hier ein Beispiel, wo eine verschachtelte/innere Klasse nützlich sein könnte: http://stackoverflow.com/a/78858/1759987 –

0

AttributeError: type object 'User' has no attribute 'user_session'. Sie bekommen das von self.user_session = User.user_session. User hat kein Attribut namens user_session. Eher eine Instanz User() hat.

Wie auch immer, innerer class es ?? Sehen Sie, was passiert, wenn Sie einfach eine zufällige print Anweisung oder eine def innerhalb einer class Definition schreiben. Es ist perfekt legal und sinnlos (im Allgemeinen). Entweder

  1. wandeln sie in Methoden
  2. schreiben separate Klassen und komponieren sie in eine neue Klasse.
Verwandte Themen