Форум сайта python.su
0
Добрый день.
Начал работать с системой openErp, написанной на питоне. Там довольно часто используется схема наследования такого вида:
class Classname(osv.osv)
_name='Classname'
_inherit='Classname'
......
Отредактировано (Янв. 16, 2012 09:37:07)
Офлайн
0
duh386почитать про наследование
Но тогда каким образом можно сохранить старые свойства класса?
Офлайн
0
Сорри, не нашел инфы о наследовании, кроме стандартного способа: “ Class(Parentclass):… ”. Киньте ссылкой плз.
Офлайн
0
Может кто-нибудь может набросать пару строк кода с таким функционалом, хотя бы примерно, чтобы я понял идею.
Офлайн
5
Офлайн
0
duh386А что он конкретно делает, объединяет методы двух объявленных классов в одном?
Может кто-нибудь может набросать пару строк кода с таким функционалом, хотя бы примерно, чтобы я понял идею.
Офлайн
0
Piton23
Хм, и в какой по счету ссылке я могу найти интересующие меня примеры? Вы уверены что читали вопрос?
yrttyr
Да. Есть родительский класс. Есть унаследованный класс. Затем от родительского класса наследуется еще один, с таким же именем, как и первый унаследованный. Судя по всему методы обоих унаследованных объединяются. Это вообще реально?
Отредактировано (Янв. 21, 2012 17:04:29)
Офлайн
0
Да реально. С помощью метаклассов, например. Могу написать, если нужно.
Офлайн
5
duh386Возьмем к примеру:
Что происходит, если я объявляю класс с уже существующим именем?
class main():
_name = "main"
_my = "no change"
class child1(main):
_name = "child1"
def out(self):
print "call out " + self._name
o1 = child1()
print o1._name # out: child1
print o1.out() # out: call out child1
class child1(main):
_name = "child2"
# Затирается старый дочерний класс
o2 = child1()
print o2._name # out: child2
print o2.out() # AttributeError, естественно класс же затерт и его (метода) не существует
# Попытаемся обратится к методу старого child1
print o1._name # out: child1
print o1.out() # А здесь нет ошибки т.к. данный объект создавался до переопределения класса
# Затираем объект новым классом
o1 = child1()
print o1._name # out: child2
print o1.out() # AttributeError Все правильно данного метода нет в новой реализации
duh386Почти. Правильно что уничтожается что видно из примера, а то что свойства и методы каким-то образом сохраняются, с чего вы взяли? они тоже уничтожаются. Тут важно когда, т.е. в какой момент создан был экземпляр/объект класса. Если создан до второго объявления дочернего, то данный экземпляр будет вести себя согласно старо-объявленному классу. Если после переопределения то согласно переопределенному. Никакие свойства не сохраняются и методы. Можно ж открыть IDLE и поэкспериментировать и почитать немного теории.
Но вероятнее всего, что старый класс уничтожается и заменяется на новый, но при этом свойства/методы старого класса где-то каким-то образом сохраняются
duh386Я вообще не понимаю зачем вам пере затирать существующий класс. Это плохая практика. Если уж так жесткая в этом необходимость то к примеру если у вас первый дочерний класс имеет свойства, которые надо сохранить, то храните не в этом дочернем классе а выше в родительском, т.е. в свойствах osv.osv. И потом пере затирайте дочерние классы хоть 10 раз а ваши свойства останутся. Но так я сомневаюсь что кто то в здравом уме делает :)
Но тогда каким образом можно сохранить старые свойства класса?
Отредактировано (Янв. 21, 2012 18:14:05)
Офлайн
0
Для 2.7
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class UnionMeta(type):
_dict = dict()
def __new__(meta, classname, bases, classdict):
if classname in meta._dict:
keep_cls = meta._dict[classname]
for key, value in classdict.items():
setattr(keep_cls, key, value)
return keep_cls
else:
inst = type.__new__(meta, classname, bases, classdict)
meta._dict[classname] = inst
return inst
class Union(object):
__metaclass__ = UnionMeta
# Тестируем
class A(Union):
def meth_a(self):
print 'A'
class A(Union):
def meth_a2(self):
print 'A2'
a = A()
a.meth_a()
a.meth_a2()
Офлайн