LINUX.ORG.RU

python: повышающее преобразование?


0

0

Понимаю, что python -- язык с динамической типизацией, но мне крайне любопытен вопрос
о повышающем преобразовании объекта при передаче оного в какую-нибудь функцию. 
Как это реализовать в python?

Хочется что-то вроде этого: http://pastebin.org/24610 (этот же код ниже).

Т.е., что бы use_it() был доступен *только* интерфейс базового класса. Спасибо.


#include <iostream>


class Base
{
    public:
        int data_;

        Base(): data_(100) {};
        virtual void hello() { std::cout << "base::hello()" << std::endl; }
        void setData(int data) { data_ = data; }
};

class Derived: public Base
{
    public:
        Derived(): Base() {data_ = 500;};
        virtual void hello() { hi(); }
        void hi() { std::cout << "derived::hi()" << std::endl;}
};


void use_it(Base* b)
{
    b->hello();
    b->setData(6000);
}


int main(int argc, char** argv)
{
    Derived* d = new Derived();
    std::cout << "data = " << d->data_ << std::endl;
    use_it(dynamic_cast<Base *>(d));
    std::cout << "data = " << d->data_ << std::endl;

    delete d;

    return 0;
}

anonymous

Какой то непонятный пример.

use_it(dynamic_cast<Base *>(d));

dynamic_cast здесь абсолютно бессмысленен.

Функции в пайтоне итак виртуальные.

Чего хочется то?

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> Функции в пайтоне итак виртуальные.

Мне об этом прекрасно известно.

> Чего хочется то?

Как написано в исходном сообщении, хочется, что бы функции, которой будет передаваться экземпляр класса работала с ним исключительно через интерфейс базового класса.

anonymous
()
Ответ на: комментарий от tailgunner

> а по-сложному - перегрузить __getattr__

Ненужных сложностей хотелось бы избежать. Но этот вариант в различных ипостасях попробовать можно. Спасибо.

anonymous
()
Ответ на: комментарий от anonymous

>> а по-сложному - перегрузить __getattr__

> Ненужных сложностей хотелось бы избежать. Но этот вариант в различных ипостасях попробовать можно

ыыыы... а тебе это точно нужно? Тогда посмотри Bastion.py

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> По-простому это не сделаешь, а по-сложному - перегрузить __getattr__, и всё.

Нахрена? Переписываю код с С++ на питон как он есть:

class Base(object):
    def __init__(self):
        self.data_ = 100

    def hello(self):
        print "base::hello()"

    def setData(self, data):
        self.data_ = data

class Derived(Base):
    def __init__(self):
        super(Derived, self).__init__()
        self.data_ = 500

    def hello(self):
        self.hi()

    def hi(self):
        print "derived::hi()"

def use_it(whatever):
    whatever.hello()
    whatever.setData(6000)

if __name__ == "__main__":
    d = Derived()
    print "data =", d.data_
    use_it(d)
    print "data =", d.data_

Питон - это динамический язык без контроля типов, в нем нет апкастов и даункастов,
они просто не нужны.

outdoor_profanity
()
Ответ на: комментарий от outdoor_profanity

>> По-простому это не сделаешь, а по-сложному - перегрузить __getattr__, и всё.

> Нахрена?

А ты у того человека спрашиваешь? А то я могу придумать ситуацию-другую, когда это полезно, но не уверен, что это случаи OP.

> Питон - это динамический язык без контроля типов, в нем нет апкастов и даункастов, они просто не нужны.

Я немного знаю Питон, спасибо.

tailgunner ★★★★★
()
Ответ на: комментарий от vsemnazlo

> Тогда посмотри Bastion.py

Какой-то он straight-forward, имхо. Но все равно спасибо за идею.

> def change_class(instance,new_class):

Это создает копию, а не использует directly существующий экземпляр. Этот вариант я рассматривал -- не подходит. Спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.