උදාහරණයක පන්ති නාමය ලබා ගැනීම?


1464

පයිතන් හි වස්තුවක නිදසුනක් නිර්මාණය කළ පන්තියේ නමක් මා සොයා ගන්නේ කෙසේද? මා මෙය කරන්නේ ශ්‍රිතයේ නිදර්ශන පන්තිය ව්‍යුත්පන්න කර ඇති මූලික පන්තියෙන් නම්?

සමහර විට පරීක්‍ෂණ මොඩියුලය මට මෙතැනින් පිටතට උදව් වන්නට ඇතැයි සිතුවද, නමුත් එය මට අවශ්‍ය දේ ලබා දෙන බවක් නොපෙනේ. __class__සාමාජිකයා විග්‍රහ කිරීම කෙටියෙන්, මෙම තොරතුරු ලබා ගන්නේ කෙසේදැයි මට විශ්වාස නැත.


පංති විචල්‍යයෙන් ඔබ හරියටම විග්‍රහ කරන්නේ කුමක් ද ?
sykora

1
උදාහරණයට අයත් පන්තියේ ඉහළ මට්ටමේ නම (මොඩියුලයේ නමක් නොමැතිව ...)
ඩෑන්

මම හිතන්නේ ප්‍රතිවිරුද්ධ දෙය වඩා දුෂ්කර වනු ඇත (ක්‍රමය / ශ්‍රිතය අර්ථ දක්වා ඇති පන්තිය ලබා ගැනීමට).
ඇලෙක්සි

Answers:


1950

ඔබ පන්තියේ __name__ගුණාංගය උත්සාහ කර තිබේද? එනම් type(x).__name__ඔබට අවශ්‍ය පංතියේ නම ඔබට ලබා දෙනු ඇත.

>>> import itertools
>>> x = itertools.count(0)
>>> type(x).__name__
'count'

ඔබ තවමත් පයිතන් 2 භාවිතා කරන්නේ නම්, ඉහත ක්‍රමය ක්‍රියාත්මක වන්නේ නව විලාසිතාවේ පන්ති සමඟ පමණක් බව සලකන්න (පයිතන් 3+ හි සියලුම පන්ති "නව විලාසිතාවේ" පන්ති වේ). ඔබගේ කේතය පැරණි විලාසිතාවේ පන්ති කිහිපයක් භාවිතා කරයි. දෙකටම පහත ක්‍රියා කරයි:

x.__class__.__name__

42
පුදුම සහගත සරලයි. dir(x.__class__)එය ලැයිස්තුගත නොකරන්නේ මන්දැයි සිතන්න.
cfi

45
ඇයි භාවිතය __class__පුරා typeක්රමය? එසේ : type(x).__name__. දෙවරක් අවධාරනය කරන සාමාජිකයන් ඇමතීම සෘජුවම අධෛර්යමත් නොවේද? මට භාවිතා කිරීමට ක්‍රමයක් නොපෙනේ __name__.
jpmc26

25
__class__පැරණි ආකාරයේ පන්ති සමඟ අනුකූල වීමට ඔබ කෙලින්ම භාවිතා කළ යුතුය, මන්ද ඒවායේ වර්ගය සාධාරණ ය instance.
Quantum7

15
මෙය බොහෝ විට භාවිතා කරනුයේ ල ging ු-සටහන්, ඕර්ම් සහ රාමු කේත වල සැබවින්ම බිල්ඩින් ටයිප් නාමයක් (x) තිබිය යුතුය ... නමක් ලබා ගැනීම සඳහා පරිශීලකයාට “ධෛර්යය” දෙස බැලීම භයානක පයිතොනික්, IMO නොවේ.
එරික් ඇරොනෙස්ටි

5
@ එරික් ඇරොනෙස්ටි,def typename(x): return type(x).__name__
sleblanc

400

ඔබට පන්තියේ නම නූලක් ලෙස අවශ්‍යද?

instance.__class__.__name__

6
හෝ උදාහරණයක් ලෙස .__ class__ පන්ති වස්තුව ලබා ගැනීම සඳහා: D
පෙන්සිල්චෙක්

8
ද්විත්ව අවධාරනය කළ හැකි දේපල භාවිතා කිරීම ආරක්ෂිතද?
එඩ්වඩ් ලූකා

5
D එඩ්වර්ඩ්ලූකා එය ආරක්ෂිත නොවන්නේ ඇයි? ඔබ ලියන කේතය සමඟ කිසිදු ගැටුමක් ඇති නොවන පරිදි බිල්ට් දේපල අවධාරනය කරයි
ජේ. සී. රොකමන්ඩ්

3
තනි අවධාරනයකින් අදහස් කරන්නේ / යෝජනා කරන ක්‍රමය / දේපල පුද්ගලික විය යුතු බව මම දනිමි (ඔබට පයිතන් AFAIK හි පුද්ගලික ක්‍රමවේදයන් සැබවින්ම ක්‍රියාත්මක කළ නොහැකි වුවද), සහ (සමහර) ද්විත්ව අවධාරනය කිරීම් වලද එය එසේ නොවේදැයි මම කල්පනා කළෙමි.
එඩ්වඩ් ලූකා

28
D එඩ්වර්ඩ්ලූකා ආරම්භයේ දී ද්විත්ව අවධාරනය ආරම්භයේ දී යටි ඉරි ඇඳීමකට සමාන ය, නමුත් ඊටත් වඩා “පුද්ගලික” (“පයිතන් නාම මැන්ග්ලිං” බලන්න). ආරම්භයේ සහ අවසානයේ ද්විත්ව අවධාරනය වෙනස් වේ - ඒවා පයිතන් සඳහා වෙන් කර ඇති අතර ඒවා පුද්ගලික නොවේ (උදා: __init__ සහ __add__ වැනි මැජික් ක්‍රම).
ලීග්සයිඩ් ගෝර්ඩන්

105

වර්ගය ()?

>>> class A(object):
...    def whoami(self):
...       print type(self).__name__
...
>>>
>>> class B(A):
...    pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>

මෙය පංති සාමාජිකයාට සමාන ය, නමුත් මට මෙම ප්‍රති result ලය අතින් විග්‍රහ කළ යුතුය, එය තරමක් කරදරයකි ...
දාන්

8
මම මේකට කැමතියි. මේ ආකාරයෙන්, උප පංතියේ නම ලබා ගැනීමට මූලික පන්තියක සිටිය හැකිය.
joctee

6
හෝ එකම හැසිරීම ලබා ගැනීම self.__class__.__name__වෙනුවට type(self).__name__. යම් දෙයක් type()නොමැති නම් මා නොදන්නා ශ්‍රිතයක් කරයිද?
andreb

2
ඔබ භාවිතා කරන්නේ නම් type(item)ලැයිස්තුවක් අයිතමය මත ඇති වන ප්රතිඵලය <type 'instance'>අතර item.__class__.__name__පන්ති නම පවත්වයි.
ග්‍රොච්නි

1
මම හිතන්නේ ro ග්‍රොච්නි සඳහන් කරන කාරණය අදාළ වන්නේ පයිතන් 2.x හි ඇතැම් පන්ති සඳහා පමණි, මෙහි බලන්න: stackoverflow.com/questions/6666856/…
Nate CK

44
class A:
  pass

a = A()
str(a.__class__)

මෙම නියැඳියට කේතය ඉහත (මෙම අන්තර් භාෂණ දී ආදාන විට) නිෂ්පාදනය කරනු ඇත '__main__.A'විරුද්ධ ලෙස 'A'නම්, සකස් කරන ලද __name__'විශේෂණය යොදා ගත්තේය ඇත. හුදෙක් ප්රතිඵලයක් යැවීමෙන් A.__class__වෙත strමෙම අන්තහ්කරණය ඔබ වෙනුවෙන් හසුරුවන ඉදිකිරීමටත්. කෙසේ වෙතත්, ඔබට වඩාත් පැහැදිලි යමක් අවශ්‍ය නම් ඔබට පහත කේතය භාවිතා කළ හැකිය.

"{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)

ඔබට වෙනම මොඩියුලවල අර්ථ දක්වා ඇති එකම නමක් සහිත පන්ති තිබේ නම් මෙම හැසිරීම වඩාත් සුදුසු වේ.

ඉහත දක්වා ඇති නියැදි කේතය පයිතන් 2.7.5 හි පරීක්ෂා කරන ලදී.


29

පයිතන් 2 හි,

type(instance).__name__ != instance.__class__.__name__
# if class A is defined like
class A():
   ...

type(instance) == instance.__class__
# if class A is defined like
class A(object):
  ...

උදාහරණයක්:

>>> class aclass(object):
...   pass
...
>>> a = aclass()
>>> type(a)
<class '__main__.aclass'>
>>> a.__class__
<class '__main__.aclass'>
>>>
>>> type(a).__name__
'aclass'
>>>
>>> a.__class__.__name__
'aclass'
>>>


>>> class bclass():
...   pass
...
>>> b = bclass()
>>>
>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.bclass at 0xb765047c>
>>> type(b).__name__
'instance'
>>>
>>> b.__class__.__name__
'bclass'
>>>

6
මෙය සත්‍ය වන්නේ පැරණි පයිතන් 2.x සඳහා පමණි. 3.x දී, bclass () bclass (වස්තුව) වෙත විසඳනු ඇත. ඊටත් පසුව, පයිතන් 2.2 හි නව පන්ති දර්ශනය විය.
ඇල්කාල්ඩ්

16

හොඳ ප්රශ්නයක්.

යමෙකුට උපකාර කළ හැකි GHZ මත පදනම් වූ සරල උදාහරණයක් මෙන්න:

>>> class person(object):
        def init(self,name):
            self.name=name
        def info(self)
            print "My name is {0}, I am a {1}".format(self.name,self.__class__.__name__)
>>> bob = person(name='Robert')
>>> bob.info()
My name is Robert, I am a person

13

විකල්පයක් ලෙස ඔබට classmethodසැරසිලි කරුවා භාවිතා කළ හැකිය :

class A:
    @classmethod
    def get_classname(cls):
        return cls.__name__

    def use_classname(self):
        return self.get_classname()

භාවිතය :

>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'

10

විශේෂ __name__ගුණාංගය උදුරා ගැනීමට අමතරව , දී ඇති පන්තියක් / ශ්‍රිතයක් සඳහා සුදුසුකම් ලත් නමක් ඔබට අවශ්‍ය විය හැකිය . මෙය සිදු කරනුයේ වර්ග අල්ලා ගැනීමෙනි __qualname__.

බොහෝ අවස්ථාවන්හීදී, මේවා හරියටම සමාන වනු ඇත, නමුත්, කැදැලි පන්ති / ක්‍රම සමඟ කටයුතු කිරීමේදී මේවා ඔබට ලැබෙන ප්‍රතිදානයේ වෙනස් වේ. උදාහරණයක් වශයෙන්:

class Spam:
    def meth(self):
        pass
    class Bar:
        pass

>>> s = Spam()
>>> type(s).__name__ 
'Spam'
>>> type(s).__qualname__
'Spam'
>>> type(s).Bar.__name__       # type not needed here
'Bar'
>>> type(s).Bar.__qualname__   # type not needed here 
'Spam.Bar'
>>> type(s).meth.__name__
'meth'
>>> type(s).meth.__qualname__
'Spam.meth'

ස්වයං විග්‍රහය යනු ඔබ පසුපසින් සිටින නිසා, මෙය සැමවිටම ඔබට සලකා බැලිය යුතුය.


2
__qualname__පයිතන් 3.3+ සඳහා වන බව සැලකිල්ලට ගත යුතුය
FireAphis

11
මගේ මෘදුකාංගයේ "මෙත්" හි කිසිවක් නම් කිරීමෙන් මම වැළකී සිටිමි.
බොබට්

__qualname__එදිරිව අදාළ පැහැදිලි කිරීම __name__: stackoverflow.com/questions/58108488/what-is-qualname-in-python
ti7

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.