Програмиране с Python » Форуми » Задачи

Връщани стойности

(49 posts)

  1. Joan
    Member

    Posted 6 years ago #
  2. Ако атрибутът започва с долна черта поведението не трябва да е по-различно от нормалното. Все едно не си предефинирал __getattrbiute__.

    От условието:

    обект с атрибути cls и value, в които стоят съответно класа, където е намерен атрибута, и стойността на атрибута в този клас.

    Ако пита

    Posted 6 years ago #
  3. uZer
    Member

    Ако атрибутът започва с долна черта поведението не трябва да е по-различно от нормалното. Все едно не со предефинирал __getattrbiute__.

    тоест

    rs=Resolver(A,DFS)
    print rs.__hidden.value

    трябва да работи както обикновенно???

    Posted 6 years ago #
  4. Posted 6 years ago #
  5. uZer
    Member

    значи,
    ако запи

    Posted 6 years ago #
  6. Относно тези с долната черта: представете си, че не сте пипали класа.

    Относно __getattr__ — не, не е добре. Виж каква точно е разликата между __getattr__ и __getattribute__. Ето ти пример, в който ще има

    Posted 6 years ago #
  7. uZer
    Member

    в моя случай връща AttributeError: '_x'
    дали това се иска?

    Posted 6 years ago #
  8. plamKaTa
    Member

    А това последното трябва да върне нещо от сорта на:
    AttributeError: 'Resolver' object has no attribute '_x'
    вместо 69, ако е написано правилно.

    А в случай, че вместо _x дефинираме атрибута като x (без подчертавка), то очаквания резултат би трябвало да е нещо от сорта:
    >>> r = p5.Resolver(A, p5.BFS)
    >>> r.x
    <p5.ResolveResult object at 0x014FE9D0>
    >>> r.x.value
    42

    Нали така:) или нещо не съм разбрал правилно условието?

    Posted 6 years ago #
  9. Не!

    Отново: аргументите, които започват с долна черта се третират като най-обикновени атрибути и трябва да се resolve-нат по стандартния начин, все едно не сме пипали по класа изобщо. Накратко: оставете интерпретатора сам да си resolve-не атрибутите започващи с долна черта.

    В горния мой пример трябва

    Posted 6 years ago #
  10. uZer
    Member

    е, при мен връща 42
    и с __getattr__

    Posted 6 years ago #
  11. plamKaTa
    Member

    В горният пример, ако добавите:
    >>> A._x
    69
    Което е напълно очакваното поведение, тъй като:

    При класове от стар стил, атрибутите се търсят в родителите по дълбочина.
    При класове от нов стил, атрибутите се търсят в родителите по

    Posted 6 years ago #
  12. uZer
    Member

    аз вече съвсем изгубих ни

    Posted 6 years ago #
  13. plamKaTa
    Member

    За атрибути започващи с '_' няма значение какъв е метода на търсене - трябва да оставим интерпретатора да ги оцени.

    Posted 6 years ago #
  14. Ей, един човек да разбере най-после :-)

    Posted 6 years ago #
  15. plamKaTa
    Member

    Е да ама от условието по никакъв начин не се разбира, че това се иска:

    класът трябва да поддържа оператора . (точка, __getattribute__) като обръщение от типа obj.attr, където obj е от тип Resolver, трябва да върне:
    * атрибутът на obj с име attr, ако attr започва с долна черта (_)

    и по конкретно:

    където obj е от тип Resolver, трябва да върне:
    * атрибутът на obj с име attr, ако attr започва с долна черта (_)

    Аз оставам с впечатлението, че тук се говори за атрибути на обект от тип Resolver, а не за атрибути на подадената йерархия от класове (т.е атрибут на подадения клас).
    Освен това примерния тест по никакъв начин не ме разубеждава.

    Posted 6 years ago #
  16. uZer
    Member

    то май повечето са с такова впечатление...

    Posted 6 years ago #
  17. djv
    Member

    Ако има

    Posted 6 years ago #
  18. plamKaTa
    Member

    djv, явно и ти си от заблудените - условието не е коректно зададено.
    Поне според последните 3 поста на nb по тази тема.

    Posted 6 years ago #
  19. uZer
    Member

    я тогава още въпрос.
    сега, в моя случай вече съм написал __getattr__ и не ми се преписва цял куп работи.
    мога ли, например, в случай "_" да направя просто едно търсене в

    Posted 6 years ago #
  20. plamKaTa
    Member

    Кой не си е чел лекцията?

    При класове от стар стил, атрибутите се търсят в родителите по дълбочина.
    При класове от нов стил, атрибутите се търсят в родителите по

    Posted 6 years ago #
  21. djv
    Member

    Най-добре Бачийски да качи един тест с въпросната '_'. Явно с говорене няма да се разберем.

    Posted 6 years ago #
  22. plamKaTa
    Member

    Ето ви нещо за размисъл в/у обекти нов стил, докато Бачийски качи въпрсния тест:

    class A(object): pass
    class B(A): pass
    class C(object): pass
    class D(B, C): pass
    A._x = 1
    C._x = 0
    >>> d = D()
    >>> d._x
    1

    но когато всички наследяват А:

    class A(object): pass
    class B(A): pass
    class C(A): pass
    class D(B, C): pass
    A._x = 1
    C._x = 0
    >>> d = D()
    >>> d._x
    0

    *Когат обектите са от стар стил поведението в тези два случая е консистентно: d._x = 1 и в двата случая.

    Posted 6 years ago #
  23. plamKaTa
    Member

    А ето го и моят тест в случай че условието се окаже наистина гре

    Posted 6 years ago #
  24. uZer
    Member

    plamKaTa благодарности за теста!!
    при мен стана!
    ....
    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s

    OK
    направо кеф!

    ето още повод за размисли
    `class d(object):pass
    class c(object): pass
    class b(d): pass
    class a(b,c): pass
    c._x = 42
    d._x = 69

    print a.__mro__
    print a._x`

    връща
    (<class '__main__.a'>, <class '__main__.b'>, <class '__main__.d'>, <class '__main__.c'>, <type 'object'>)
    69

    това по прилича на търсене в дълбочина. ама новите обекти би трябвало да търсят в

    Posted 6 years ago #
  25. plamKaTa
    Member

    Не, не гре

    Posted 6 years ago #
  26. За да не си губите времето с глупости, тестове с атрибути, започващи с долна черта няма да има!

    Posted 6 years ago #
  27. uZer
    Member

    да, сорри, тестовете са 5
    и имам
    .....
    ----------------------------------------------------------------------
    Ran 5 tests in 0.000s

    OK

    просто последния го табнах случайно при копирането и той влезе в последния... :)

    Posted 6 years ago #
  28. Posted 6 years ago #
  29. fn80017
    Member

    Posted 6 years ago #
  30. fn80017,
    За съжаление не може

    Posted 6 years ago #

RSS feed for this topic

Reply »

You must log in to post.