Portál AbcLinuxu, 26. dubna 2024 00:33


Dotaz: Python - jak v inner class ziskat obsah z promenne v parent class

20.8.2015 22:13 zdenek2008 | skóre: 26
Python - jak v inner class ziskat obsah z promenne v parent class
Přečteno: 197×
Odpovědět | Admin
V rodicovske tride "entity" bych chtel mit vnitrni tridu "asset" ktera bude potrebovat mit pristup k promenne definovane o stupinek vys v te rodicovske, konkretne k jejimu nazvu v promenne "name". Prozatim zkousim ruzne navody z webu ale dostavam chybova hlaseni; nevedeli byste nekdo jak "name" spravne nacist do funkce "describe_yourself()" ve tride "asset"? Predem diky za pripadne tipy.
class entity:
  name = ""
  
  def __init__(self, name):
    self.name = name
    self.asset = self.asset()    
    
  def say_hello(self):
    print "Hello, my name is " + self.name

  class asset:
    def describe_yourself(self):
      print "This is [ZDE SE MA VYPSAT OBSAH PROMENNE name Z PARENT CLASS]'s inherent asset"
        
#create virtual object
dezo = entity("Dezo")

#call methods owned by virtual object
dezo.say_hello()
dezo.asset.describe_yourself()
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.8.2015 00:47 chrono
Rozbalit Rozbalit vše Re: Python - jak v inner class ziskat obsah z promenne v parent class
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebolo by najjednoduchšie predať potrebné parametre priamo pri vytváraní objektu?
21.8.2015 01:09 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Python - jak v inner class ziskat obsah z promenne v parent class
Odpovědět | | Sbalit | Link | Blokovat | Admin
Místo třídy asset s metodou describe_yourself() udělej jen metodu describe(). Celé se to hezky zjednoduší:
class Entity:
    def __init__(self, name):
        self.name = name
    
    def say_hello(self):
        print "Hello, my name is " + self.name

    def describe(self):
        print "This is " + self.name + "'s inherent asset"
        
#create virtual object
dezo = Entity("Dezo")

#call methods owned by virtual object
dezo.say_hello()
dezo.describe()
Jenom upozorňuji, že by bylo lepší, kdyby v té třídě žádný print nebyl...
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
rADOn avatar 21.8.2015 15:50 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python - jak v inner class ziskat obsah z promenne v parent class
Odpovědět | | Sbalit | Link | Blokovat | Admin
To afaik nejde udelat a ani to nedava smysl v jazyce kde nejsou obory platnosti. V pythonu jsou vsechny objekty organizovane v oborech platnosti (namespaces) a tvuj kod je ekvivalentni nasledujicimu:
class asset_tmp:
  def describe_yourself(self):
    print "This is [ZDE SE MA VYPSAT OBSAH PROMENNE name Z PARENT CLASS]'s inherent asset"

class entity:
  name = ""
 
  def __init__(self, name):
    self.name = name
    self.asset = self.asset()    
    
  def say_hello(self):
    print "Hello, my name is " + self.name

  asset = asset_tmp

asset_tmp.__name__ = "asset"  # pro puristy
del asset_tmp
…ergo i kdyby se ti to povedlo nejak zaridit tak to stejne nejspis nebude delat to co potrebujes nebo to bude zbytecne slozity.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
rADOn avatar 21.8.2015 16:08 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python - jak v inner class ziskat obsah z promenne v parent class
BTW nejde o to ze by to zaridit neslo. Kdyz to vezmu doslova tak je dost jednoduche:
class Asset(object):
  def __init__(self, cls):
    self.cls = cls
  
  def describe_yourself(self):
    print "This is %s's inherent asset" % self.cls.name


class Entity(object):
  name = ""
  
  def __init__(self, name):
    self.name = name
    self.asset = Asset(self)
    
  def say_hello(self):
    print "Hello, my name is " + self.name
Klidne to muzes vrazit do namespace tridy, ale nedava smysl to takhle svazovat kdyz Asset objekt muzes aplikovat na libovolny jiny objekt. A cely je to cviceni v marnosti pacz kdyz se na to podiva pythonista, tak uvidi jenom zbytecne prekomplikovany zpusob jak napsat dezo.__name__.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
21.8.2015 19:45 Delaunay | skóre: 17 | blog:
Rozbalit Rozbalit vše Re: Python - jak v inner class ziskat obsah z promenne v parent class
Odpovědět | | Sbalit | Link | Blokovat | Admin
Stačí do konstruktoru třídy entity přidat jediný řádek:
self.asset.name = name

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.