Доступ к другому классу из словаря в классе - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь получить доступ к классу Castle () с помощью словаря в классе Rooms ().

Я не понимаю, как получить доступ только к room1 или room2 без случайного доступа к обоим?

Я исчерпал все возможности, которые только могу придумать, но уверен, что это, наверное, что-то очень простое. Я скучаю.Заранее спасибо!

class Castle():
    def enter():
        print("This is castle")


class Door():
    def enter():
        print("This is door")


class Rooms():
    def dictionary():
        items = {
        'room1': Castle.enter(),
        'room2': Door.enter()
        }

Rooms.dictionary()['room1']

распечатывает:

This is castle
This is door
Traceback (most recent call last):
  File "C:\Users\James\Python\03_ZedShaw\test.py", line 22, in <module>
    Rooms.dictionary()['room1']
TypeError: 'NoneType' object is not subscriptable

Ответы [ 3 ]

0 голосов
/ 03 октября 2018
  • Вы забыли вернуть items из dictionary.Кроме того, методы enter ничего не возвращают, поэтому в items все равно будет None.Возможно, вы захотите пересмотреть, как работают функции Python.
  • Кажется ненужным воссоздавать items каждый раз, когда вызывается Rooms.dictionary.Вы можете использовать экземпляр класса.
  • Как писал в комментариях Тимгеб, вы забыли аргумент self в методах или декоратор @staticmethod.


class Castle:
    @staticmethod
    def enter():
        return "This is castle"


class Door:
    @staticmethod
    def enter():
        return "This is door"


class Rooms:
    items = {'room1': Castle.enter(),
             'room2': Door.enter()}

    @classmethod
    def dictionary(cls, key):
        return cls.items[key]

print(Rooms.dictionary('room1'))
# This is castle
print(Rooms.dictionary('room2'))
# This is door

На данный момент вам на самом деле не нужно Rooms.dictionary:

class Rooms:
    items = {'room1': Castle.enter(),
             'room2': Door.enter()}


print(Rooms.items['room2'])
# This is door
0 голосов
/ 03 октября 2018
class Castle():
    def enter():
        return "This is castle"


class Door():
    def enter():
        return "This is door"

class Rooms():
    items = {'room1': Castle.enter(),'room2': Door.enter()}

    def dictionary():
        return Rooms.items

Код теста:

 Rooms.dictionary()

Результат:

 {'room1': 'This is castle', 'room2': 'This is door'}
0 голосов
/ 03 октября 2018

Вы должны сделать так, чтобы функция сначала возвращала словарь

return items

После этого необходимо изменить словарь:

items = {
         'room1': 'Castle.enter()',
         'room2': 'Door.enter()'
        }

Затем вам нужно использовать функцию exec(), если вы нене ожидайте вывода или eval(), если ожидаете вывода, подобного этому:

exec(Rooms.dictionary()['room1'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...