AMcoder - javascript, python, java, html, php, sql

Ինչպե՞ս սահմանել այն հատկանիշը Python 3-ի enum դասում, որը enum արժեք ՉԷ: [կրկնօրինակ]

Ինչպե՞ս սահմանել ատրիբուտ Python 3 enum դասում, որը enum արժեք ՉԷ:

class Color(Enum):
    red = 0
    blue = 1
    violet = 2
    foo = 'this is a regular attribute'
    bar = 55  # this is also a regular attribute

Բայց սա ինձ համար կարծես թե ձախողվում է: Թվում է, որ Color-ը փորձում է ներառել foo-ն և bar-ը որպես իր enum արժեքների մաս:

ԽՄԲԱԳՐԵԼ. Որպեսզի չմտածեք, որ ես չեմ օգտագործում Enum-ը այնպես, ինչպես նախատեսված է... Օրինակ, վերցրեք պաշտոնական Python փաստաթղթերի Enum դասի Planet-ի օրինակը (docs.python.org/3/library/enum.html#planet): Նկատի ունեցեք, որ նրանք սահմանում են գրավիտացիոն G հաստատունը surface_gravity() մեթոդով: Բայց սա տարօրինակ կոդ է: Նորմալ ծրագրավորողը կասեր՝ մի անգամ դրեք այդ G հաստատունը՝ ֆունկցիայից դուրս։ Բայց եթե ես փորձեմ G-ն դուրս բերել (բայց ոչ գլոբալ, պարզապես դասի շրջանակ), ապա ես բախվում եմ այն ​​խնդրին, որի մասին հարցնում եմ այստեղ:

08.10.2015

  • Ինչու՞ է դա քեզ պետք: Չես կարող այդպես անել, ոչ: 08.10.2015
  • Չկա ներկառուցված սարք, որը որոշ ատրիբուտներ համարում է թվեր, իսկ մյուսները՝ «կանոնավոր»: Ինչ վերաբերում է Python-ին, ձեր թվում foo-ի և bar-ի միջև տարբերություն չկա: Միայն այն պատճառով, որ արժեքի համար օգտագործել եք այլ տեսակի օբյեկտ, տարբերություն չկա: 08.10.2015
  • Դե, որովհետև այս ֆանտաստիկ Enum դասերի գոյության պատճառներից մեկն այն է, որ դրանք կարող են լինել սովորական դասեր, գիտեք, մեթոդներով և այլն, և, ի վերջո, ես հասնում եմ մի կետի, որտեղ ինձ անհրաժեշտ է դասի մակարդակի հաստատուն: 08.10.2015
  • Դասի մակարդակի «հաստատունները» միշտ թվարկման անդամներ են, եթե սահմանված են դասի մարմնում. Python-ը, այնուամենայնիվ, չունի «հաստատություններ»: Փոխարենը ես կհավատայի գլոբալին: 08.10.2015
  • Հնարավոր է Enum-ում ունենալ դասի մակարդակի հաստատուններ -- տես այս պատասխանը: Չկա պաշտպանություն հաստատուն արժեքի վերանշանակումից, չնայած, ինչպես սովորական դասերին: 09.03.2016
  • @EthanFurman Ես իսկապես չեմ հասկանում, թե ինչու եք անհրաժեշտություն զգում գնալ փակ հարցին փակելուց 5 ամիս հետո՝ բացահայտորեն կապվելով ձեր պատասխանին (որը նաև հետևյալն է. ընդունված պատասխանը մոտ թիրախի վրա), և դեմ քվեարկություն այս փակ հարցի երկու պատասխանները, երբ այդ պատասխանները կարող են մի փոքր բարդ լինել, բայց, այնուամենայնիվ, երկուսն էլ տալիս են խնդրի աշխատող լուծում: Դուք այդքան չափից ավելի վստահ ե՞ք, որ ձեր լուծումը այս պահանջի համար միակ ընդունելի լուծումն է: 09.03.2016
  • @poke. Ես վերանայում եմ բոլոր [enums] [python] պատասխանները և անհրաժեշտության դեպքում վեր/ներքև քվեարկում եմ: Ես համաձայն չեմ Enum տվյալների տիպի ձեր բնութագրմանը այս դեպքում (այլ դեպքերում դուք իմ կողմից կողմ ձայներ ունեք): Եթե ​​ինչ-որ մեկը գրեր իմ լուծումը, ես նույն կերպ կվարվեի այս պատասխանների/մեկնաբանությունների նկատմամբ: 09.03.2016

Պատասխանները:


1

Enum տիպի նպատակը enum արժեքներ սահմանելն է, ուստի ոչ enum արժեքները տեսականորեն դուրս են այս տեսակի շրջանակներից: Հաստատունների համար դուք, այնուամենայնիվ, պետք է հաշվի առնեք դրանք տիպից դուրս տեղափոխելու մասին. դրանք, ամենայն հավանականությամբ, ուղղակիորեն կապված չեն թվային արժեքների հետ (այլ ավելի շուտ որոշակի տրամաբանություն, որը հիմնված է դրանց վրա), ինչպես նաև պետք է լինեն տիպի փոփոխվող հատկություն: Սովորաբար, դուք պարզապես հաստատուն եք ստեղծում մոդուլի մակարդակում:

Եթե ​​ձեզ իսկապես ինչ-որ բան է պետք տիպի վրա, ապա կարող եք այն ավելացնել որպես դասի մեթոդ.

class Color(Enum):
    red = 0
    blue = 1
    violet = 2
    bar = 55

    @classmethod
    def foo (cls):
        return 'this is a not really an attribute…'

Եվ օգտագործելով classproperty նկարագրիչը այս պատասխանից, դուք կարող եք նաև այն վերածել դասի մակարդակի հատկության, որը կարող եք մուտք գործել այնպես, կարծես դա նորմալ հատկանիշ էր.

class Color(enum.Enum):
    red = 0
    blue = 1
    violet = 2
    bar = 55

    @classproperty
    def foo (cls):
        return 'this is a almost a real attribute'
>>> Color.foo
'this is a almost a real attribute'
>>> list(Color)
[<Color.red: 0>, <Color.blue: 1>, <Color.violet: 2>, <Color.bar: 55>]
08.10.2015
  • @EthanFurman լավ, այո: Աշխատանքային օրերը կարող են շատ արագ դառնալ բավականին հագեցած։ Ես այլևս չեմ հիշում այդ մեջբերումի համատեքստը, և իսկապես դժվար է իմանալ, թե ինչ էի մտածում 5 ամիս անց… բայց ենթադրում եմ, թե ինչ էի փորձում ասել, երբ անդամ ունես բաց է տիպի օբյեկտի վրա, հանրային ինտերֆեյսը պարզապես խնդրում է մուտք գործել և փոփոխել այն: Դա իսկապես լավ գաղափար չէ հաստատունների համար: Կոնստանտները պետք է լինեն ապահով տեղ, կամ գոնե հստակ նշվեն որպես հաստատուններ: 10.03.2016
  • Ահ, դա իմաստ ունի: Շնորհակալություն։ 10.03.2016

  • 2

    enum.Enum դաս կառուցելիս բոլոր կանոնավոր ատրիբուտները դառնում են թվարկման անդամ: Արժեքի տարբեր տեսակը տարբերություն չի դնում:

    Սովորական ատրիբուտներ ասելով ես նկատի ունեմ բոլոր այն օբյեկտները, որոնք նկարագրիչ չեն (ինչպես գործառույթներն են) և բացառված անուններ (օգտագործելով մեկ ընդգծված անուններ, տես Թվարկումների թույլատրված անդամներն ու հատկանիշները բաժին):

    Եթե ​​Ձեզ անհրաժեշտ են լրացուցիչ ատրիբուտներ վերջնական enum.Enum օբյեկտի վրա, ավելացրեք ատրիբուտներ հետո.

    class Color(Enum):
        red = 0
        blue = 1
        violet = 2
    
    Color.foo = 'this is a regular attribute'
    Color.bar = 55
    

    Դեմո:

    >>> from enum import Enum
    >>> class Color(Enum):
    ...     red = 0
    ...     blue = 1
    ...     violet = 2
    ... 
    >>> Color.foo = 'this is a regular attribute'
    >>> Color.bar = 55
    >>> Color.foo
    'this is a regular attribute'
    >>> Color.bar
    55
    >>> Color.red
    <Color.red: 0>
    >>> list(Color)
    [<Color.red: 0>, <Color.blue: 1>, <Color.violet: 2>]
    
    08.10.2015
  • Enum metaclass-ը իսկապես աջակցում է @eng-ի օգտագործման դեպքը նկարագրող արձանագրության միջոցով (այլ կերպ ասած՝ Python-ն աջակցում է դրան, ես ստիպված չէի որևէ լրացուցիչ բան անել): 09.03.2016
  • @EthanFurman. Այո, դուք արեցիք, դուք պետք է ստեղծեիք նկարագրիչ, որն իմ գրքում, իհարկե, լրացուցիչ բան է անում: Ինչը գեղեցիկ և խելացի հնարք է, բայց դա իմ տեխնիկապես սխալ չի դարձնում: Արդյո՞ք իմ պատասխանն այդքան անօգնական էր՝ դեմ քվեարկության արժանի լինելու համար: 09.03.2016
  • Ահ, ես նկատի ունեի, որ ես կարիք չունեի որևէ լրացուցիչ բան անելու մետակլաս ստեղծելիս՝ այս օգտագործման դեպքին աջակցելու համար: Դասերի ստեղծումից հետո ատրիբուտներ հատկացնելու տգեղ հաքի և մեկնաբանություններում սխալ տեղեկատվության պատճառով ես դեմ քվեարկեցի: Իմ հույսն այն էր, որ ընդհանուր -1 միավորը կզգուշացնի ապագա փնտրողներին չօգտագործել այս պատասխանները: 09.03.2016
  • @EthanFurman. Մենք հեշտությամբ կարող ենք մաքրել մեկնաբանությունները. պարզապես դրոշակեք նրանց, ովքեր կարծում եք, որ պետք է գնան: Նրանք պատասխանի մաս չեն կազմում։ Դուք որպես լուծում նշում եք դասի ստեղծումից հետո ատրիբուտներ նշանակելը ձեր իսկ պատասխանում: 09.03.2016
  • Այո, ես նշեցի իմ պատասխանում դասի ստեղծումից հետո հատկանիշեր նշանակելը. Ես էլ նշեցի, թե ինչու դա լավ լուծում չէ։ 09.03.2016
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..