Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2010 04:55:58

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

копирование экземпляра

Андрей Светлов
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>
>>>
Если я все правильно понимаю, то после присвоения b.center.x = 10 получится некая неоднозначность с атрибутом x для объекта b.center: x, как атрибут класса Coord и x, как атрибут конкретного экземпляра класса Coord (т.е b.center)
уж если единые координаты, то наверно как-то так:
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)

Офлайн

#2 Март 24, 2010 09:39:46

callret
От:
Зарегистрирован: 2007-12-24
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

копирование экземпляра

СПАСИБО! Очень помогло!



Офлайн

#3 Март 24, 2010 13:40:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

копирование экземпляра

pyuser, разделяются экземпляры, а не классы. Рассматривайте x=0 как default value.



Офлайн

#4 Март 25, 2010 06:23:50

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

копирование экземпляра

Андрей Светлов
pyuser, разделяются экземпляры, а не классы. Рассматривайте x=0 как default value.
Тогда, какой смысл в объявлении:
class Coord(object):
x = 0
y = 0
почему не
class Coord(object):
def __init__(self)
self.x = 0
self.y = 0
явное ведь лучше не явного



Офлайн

#5 Март 25, 2010 15:50:21

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

копирование экземпляра

Да, так лучше. Я писал как покороче.
Стоит еще слоты добавить, так чуть быстрее.

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")



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version