Програмиране с Python » Форуми » Задачи
Връщани стойности
(49 posts)-
Posted 6 years ago #
-
Ако атрибутът започва с долна черта поведението не трябва да е по-различно от нормалното. Все едно не си предефинирал
__getattrbiute__
.От условието:
обект с атрибути
cls
иvalue
, в които стоят съответно класа, където е намерен атрибута, и стойността на атрибута в този клас.Ако пита
Posted 6 years ago # -
Ако атрибутът започва с долна черта поведението не трябва да е по-различно от нормалното. Все едно не со предефинирал __getattrbiute__.
тоест
rs=Resolver(A,DFS)
print rs.__hidden.valueтрябва да работи както обикновенно???
Posted 6 years ago # -
Posted 6 years ago #
-
значи,
ако запиPosted 6 years ago # -
Относно тези с долната черта: представете си, че не сте пипали класа.
Относно
__getattr__
— не, не е добре. Виж каква точно е разликата между__getattr__
и__getattribute__
. Ето ти пример, в който ще имаPosted 6 years ago # -
в моя случай връща AttributeError: '_x'
дали това се иска?Posted 6 years ago # -
А това последното трябва да върне нещо от сорта на:
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 # -
Не!
Отново: аргументите, които започват с долна черта се третират като най-обикновени атрибути и трябва да се resolve-нат по стандартния начин, все едно не сме пипали по класа изобщо. Накратко: оставете интерпретатора сам да си resolve-не атрибутите започващи с долна черта.
В горния мой пример трябва
Posted 6 years ago # -
е, при мен връща 42
и с __getattr__Posted 6 years ago # -
В горният пример, ако добавите:
>>> A._x
69
Което е напълно очакваното поведение, тъй като:При класове от стар стил, атрибутите се търсят в родителите по дълбочина.
При класове от нов стил, атрибутите се търсят в родителите поPosted 6 years ago # -
аз вече съвсем изгубих ни
Posted 6 years ago # -
За атрибути започващи с '_' няма значение какъв е метода на търсене - трябва да оставим интерпретатора да ги оцени.
Posted 6 years ago # -
Ей, един човек да разбере най-после :-)
Posted 6 years ago # -
Е да ама от условието по никакъв начин не се разбира, че това се иска:
класът трябва да поддържа оператора . (точка, __getattribute__) като обръщение от типа obj.attr, където obj е от тип Resolver, трябва да върне:
* атрибутът на obj с име attr, ако attr започва с долна черта (_)и по конкретно:
където obj е от тип Resolver, трябва да върне:
* атрибутът на obj с име attr, ако attr започва с долна черта (_)Аз оставам с впечатлението, че тук се говори за атрибути на обект от тип Resolver, а не за атрибути на подадената йерархия от класове (т.е атрибут на подадения клас).
Освен това примерния тест по никакъв начин не ме разубеждава.Posted 6 years ago # -
то май повечето са с такова впечатление...
Posted 6 years ago # -
Ако има
Posted 6 years ago # -
djv, явно и ти си от заблудените - условието не е коректно зададено.
Поне според последните 3 поста на nb по тази тема.Posted 6 years ago # -
я тогава още въпрос.
сега, в моя случай вече съм написал __getattr__ и не ми се преписва цял куп работи.
мога ли, например, в случай "_" да направя просто едно търсене вPosted 6 years ago # -
Кой не си е чел лекцията?
При класове от стар стил, атрибутите се търсят в родителите по дълбочина.
При класове от нов стил, атрибутите се търсят в родителите поPosted 6 years ago # -
Най-добре Бачийски да качи един тест с въпросната '_'. Явно с говорене няма да се разберем.
Posted 6 years ago # -
Ето ви нещо за размисъл в/у обекти нов стил, докато Бачийски качи въпрсния тест:
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 # -
А ето го и моят тест в случай че условието се окаже наистина гре
Posted 6 years ago # -
plamKaTa благодарности за теста!!
при мен стана!
....
----------------------------------------------------------------------
Ran 4 tests in 0.000sOK
направо кеф!ето още повод за размисли
`class d(object):pass
class c(object): pass
class b(d): pass
class a(b,c): pass
c._x = 42
d._x = 69print a.__mro__
print a._x`връща
(<class '__main__.a'>, <class '__main__.b'>, <class '__main__.d'>, <class '__main__.c'>, <type 'object'>)
69това по прилича на търсене в дълбочина. ама новите обекти би трябвало да търсят в
Posted 6 years ago # -
Не, не гре
Posted 6 years ago # -
За да не си губите времето с глупости, тестове с атрибути, започващи с долна черта няма да има!
Posted 6 years ago # -
да, сорри, тестовете са 5
и имам
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000sOK
просто последния го табнах случайно при копирането и той влезе в последния... :)
Posted 6 years ago # -
Posted 6 years ago #
-
Posted 6 years ago #
-
fn80017,
За съжаление не можеPosted 6 years ago #
Reply »
You must log in to post.