Измените тип экземпляра на наследование в python - PullRequest
1 голос
/ 15 марта 2020

У меня есть класс Person и 2 класса Child и Adult, которые наследуются от `Person.


class Person:

    def __init__(self, name):
        self.name = name
        self.age = 0

    def say_hi(self):
        print("Hi, I am " + self.name)

    def set_age(self, age):
        self.age = age

class Child(Person):

    def play_with_children(self):
        print("Playing with children")

class Adult(Person):

    def drink_alcohol(self):
        print("drinking")

Я хочу создать экземпляр из Person затем установите его age и в соответствии с ним этот экземпляр должен "стать" Child или Adult.

Также, если это Child и его age увеличивается, я бы хотел это "стать" Adult. Обратите внимание, что в этом коде есть ошибка, потому что конструктор Person ожидает name, потому что он предназначен для создания нового экземпляра.

person1 = Person("Marvin")

person1.set_age(15)

if person1.age < 21:
    person1 = Child()# This is an error => expects the name
    #But I wouldn't like to handle all members like this => person1 = Child(person1.name)
    #I don't want a new instance, is that even posible?

person1.say_hi() 
person1.play_with_children()


person1.set_age(25)

if person1.age > 21:
    person1 = Adult()# This is an error => expects the name
    #But I wouldn't like to handle all members like this => person1 = Adult(person1.name)
    #I don't want a new instance, is that even posible?

person1.say_hi()   
person1.drink_alcohol()
  • Возможно ли это вообще?

  • Можно ли это сделать без создания новых экземпляров?

PS: это всего лишь пример кода, показывающий проблему из более сложной проблемы, которую я есть (не совсем дети и взрослые: D).

1 Ответ

0 голосов
/ 15 марта 2020

Как уже упоминалось в комментариях, в Python 3 мы можем получить доступ к __class__ любого экземпляра и изменить его.

Хотя вы должны быть осторожны, с этим вы можете добавить атрибуты нескольких классов к одному экземпляру и создать странного монстра (методы безопасны).

person1 = Person("Marvin")

person1.set_age(15)

if person1.age < 21:
    person1.__class__ = Child

person1.say_hi() 
person1.play_with_children()


person1.set_age(25)

if person1.age > 21:
    person1.__class__ = Adult


person1.say_hi()   
person1.drink_alcohol()

Итак, монстр:

class Dog:

    def wouf(self):
        print("wouf")

person1.__class__ = Dog
print("Attributes are saved, name: "+ person1.name)
#But methods not, so now I can't use person1.say_hi()
person1.wouf()
...