Python, class init-ben help text?
Egy funkcióban egyszerűen adhatunk help textet egy arg-hoz, mint:
def asd(title):
"""
help text here
"""
return 0
Így ha pl VS Code-ban CTRL+Space-t nyomsz, kiírja, hogy ide a "title" arg-ot kell beírni és alá a "help text here" szöveget. Ez szuper!
De mondjuk van egy Class-om, amiben van egy def __init__, ebben pedig van 3 arg amit meg kell adni. Ezeknek külön külön akarnék help textet adni. Ezt hogyan lehet megoldani?
ez jelzi a kurzort: _
Pl ha a class neve Valami, akkor
myobj = Valami(_)
[ itt a help text a titlehez ]
ha nyomsz egy vesszőt, azaz a következő arg-ot adod meg:
myobj = Valami("example",_)
[ itt a helptext a számhoz ]
Illetve érdemes elolvasni a Google kódolási stílus javaslatának a kód kommentelésére tett javaslatait:
mmh, itt az a gond hogy ha pl van 2 classom és az egyiket a másikból akarom következtetni, akkor ez nem fog működni, mert felülírják egymást.
pl class A:
""" asd """
class B(A):
""" dsa """
akkor bármit teszel, csak a "dsa" lesz kiírva, ráadásul a docstringeket nem lehet "összevonni" sajnos.
Mert a python felépítésének logikájával nem asszertív és nem konzisztens.
Bármikor megtehetjük például hogy vizsgáljuk hogy típus-e az adott objektum : (Hangos szóköz csak a gyk szóközök lenyelése ellen írtam a return elé, sima szóköz lenne igazából)
def isType(a):
__return type(a) == type
Így isType(A) az True , de ha példányosítjuk a = A() akkor isType(a) már False, hiszen nem az.
Továbbá lekérhetjük miből öröklődik B osztály B.__bases__ -el. Egy tuple-t fog visszaadni, abból kiindulva hogy többszörös öröklődésben is résztvehetne, annyi elemű a visszaadott tuple ahányszoros az öröklődés.
Azt hogy belőle milyen alosztályok lettek azt a B.__subclasses__() -el tudhatjuk meg .
Rekurzívan be is lehet járni valahonnan kiindulva melyik/melyek az őse(i), melyik/melyek az alosztálya(i). A többit a kreativitásodra bízom.
Igen, azt lehetett volna jobban, ez egy szemantikai anomália, hogy van olyan típus ami nem típus típusú.
issubclass(a,object), viszont ha "a" nem típus akkor TypeError kivételt dob. Viszont mutatok olyan osztályt amire szintén kivételt dob
class Meta:
__def __init__(cls, name, bases, dct):
____pass
class Bar(metaclass=Meta):
__pass
issubclass(Bar,object) kivételt dob.
Így:
def isType(a):
__try:
____issubclass(a,object)
__except TypeError:
____return False
__return True
vagy így implementálva:
def isType(a):
__try:
____return issubclass(a,object)
__except TypeError:
____return False
isType(Bar) az False
Ugyanakkor
import inspect
inspect.isclass(Bar) szinén False értéket ad vissza.
Ezek szerint Bar az nem osztály, mondjuk példányosítani se lehet.
Az inspect.isclass bármire próbáltam amit ismerek modulba lévő valamilyen típus vagy alap típust arra az elvárt módon visselkedett, de az isType ezen változata is (a múltkori nem minden esetben).
Várj, hülyeséget írtam, isinstance-re gondoltam issubclass helyett. Valahogy így:
def isType(a):
__return isinstance(a, type)
A Bar az itt osztály lesz, csak mivel a Meta definíciójánál lemaradt, hogy az a "type" subclass-a legyen, ezért sem a __call__-t nem tudja honnan szedni a Bar (ezért nem tudod ugye példányosítani sem), se nem a __subclasscheck__, (meg __instancecheck__-et sem) tudja honnan szedni, mert a Meta-nal nincsenek olyan metódusai, és ha azok definiálatlanok, akkor asszem False-t adnak vissza. És végső soron az inspect.isclass az talán ezeket hívja valamikor, és ott bukik el. Remélem nem tévedtem nagyot most :D
Néztem az inspect.isclass pont úgy van implementálva (behúzások hiányáért elnézést, gyk hibája ):
def isclass(object):
"""Return true if the object is a class.
Class objects provide these attributes:
__doc__ documentation string
__module__ name of module in which this class was defined"""
return isinstance(object, type)
Használjuk inkább ezt az isclass függvényt szerintem.
Metaosztályt nemigen implenetáltam, de a minimális ilyen új osztály:
class Meta(type):
__pass
Ez Foo osztály már példányosítható:
class Foo(metaclass=Meta):
__pass
Vagy "értelmesen" egy új Metaclass implementálásából ilyesmiből lehet kiindulni, persze most nem írtam magyarázatokat stb. a kérdés nem is erről szólt:
class Meta(type):
__def __init__(cls, *args, **kws):
____foo1(cls)
____...
def __cmp__(cls, other):
__if not isinstance(other, Meta):
____return -1
__if cls.__name__ == other.__name__:
____return 0
__...
def ...
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!