Форум сайта python.su
Андрей СветловЕсли я все правильно понимаю, то после присвоения b.center.x = 10 получится некая неоднозначность с атрибутом x для объекта b.center: x, как атрибут класса Coord и x, как атрибут конкретного экземпляра класса Coord (т.е b.center)
callret, а прямо в лоб не пробовали? Вам же нужны не “связанные”, а “единые” координаты.>>> class Coord(object):
... x = 0
... y = 0
...
... def __repr__(self):
... return "<%s, %s>" % (self.x, self.y)
...
>>> class Box(object):
... def __init__(self):
... self.center = Coord()
...
...
>>> class Circle(object):
... def __init__(self):
... self.center = Coord()
...
>>> b = Box()
>>> b.center
<0, 0>
>>> c = Circle()
>>> c.center
<0, 0>
>>> b.center.x = 10
>>> b.center
<10, 0>
>>> c.center
<0, 0>
>>> c.center = b.center
>>> c.center
<10, 0>
>>> b.center.y = 5
>>> c.center
<10, 5>
>>>
class Coord(object):
x = 0
y = 0
def __setattr__(self, key, value):
if "x" == key:
self.__class__.x = value
elif "y" == key:
self.__class__.y = value
else:
super(Coord, self).__setattr__(key, value)
def __repr__(self):
return "<%d, %d>" % (self.x, self.y)
Отредактировано (Март 24, 2010 04:58:25)
Офлайн
СПАСИБО! Очень помогло!
Офлайн
pyuser, разделяются экземпляры, а не классы. Рассматривайте x=0 как default value.
Офлайн
Андрей СветловТогда, какой смысл в объявлении:
pyuser, разделяются экземпляры, а не классы. Рассматривайте x=0 как default value.
class Coord(object):
x = 0
y = 0
class Coord(object):
def __init__(self)
self.x = 0
self.y = 0
Офлайн
Да, так лучше. Я писал как покороче.
Стоит еще слоты добавить, так чуть быстрее.
class Coord(object):
def __init__(self, x, y):
self.x, self.y = x, y
class Coord2(object):
__slots__ = 'x', 'y'
def __init__(self, x, y):
self.x, self.y = x, y
import timeit
print timeit.timeit("a = Coord(1, 2); a.x; a.y", "from __main__ import Coord")
print timeit.timeit("a = Coord2(1, 2); a.x; a.y", "from __main__ import Coord2")
Офлайн