Dre*_*rew 8 python descriptor python-decorators
我正在尝试用Python制作一个面向对象的基于文本的游戏,并尝试实现我的第一个属性和装饰器.使用"Python 3面向对象编程"一书中的第5章,我尝试使用所讨论的示例和概念来获取以下代码,以便在实例化时设置Game-object的'current_room'属性:
class Room(object):
''' An area of the game's map.'''
def __init__(self):
print("Accessing the Room __init__ method.")
class FirstRoom(Room):
''' Just some room.'''
def __init__(self):
print("Accessing the FirstRoom __init__ method.")
super.__init__()
class SecondRoom(Room):
''' Just some other room.'''
def __init__(self):
print("Accessing the SecondRoom __init__ method.")
super.__init__()
class Game(object):
''' Creates a new game.'''
current_room = None # Class-level definition of this property.
def __init__(self):
print("Created a new Game object.")
self.current_room = FirstRoom()
@property
def current_room(self):
''' Returns the current position of the actor.'''
print("Getting the _current_room attribute for the Game object.")
return self._current_room
@current_room.setter
def set_room(self, new_room):
''' Sets the current_room property of the Game object.'''
print("Setting the _current_room attribute for the Game object.")
self._current_room = new_room
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我得到以下输出:
>>> g = Game()
Created a new Game object.
Accessing the FirstRoom __init__ method.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/drew/Desktop/test.py", line 27, in __init__
self.current_room = FirstRoom()
File "/home/drew/Desktop/test.py", line 11, in __init__
super.__init__()
TypeError: descriptor '__init__' of 'super' object needs an argument
Run Code Online (Sandbox Code Playgroud)
我的代码中缺少什么才能使这种语法有效?我是否需要为"current_room"属性明确定义描述符?[这本书没有提到任何关于描述符的内容,至少不像你在这里找到的那样:Python Descriptors Demystified.]
super 错误实际上是由于在调用 super 之前放置了 print ,以下代码有效:
class Room(object):
''' An area of the game's map.'''
def __init__(self):
print("Accessing the Room __init__ method.")
class FirstRoom(Room):
''' Just some room.'''
def __init__(self):
super().__init__()
print("Accessing the FirstRoom __init__ method.")
class SecondRoom(Room):
''' Just some other room.'''
def __init__(self):
super().__init__()
print("Accessing the SecondRoom __init__ method.")
Run Code Online (Sandbox Code Playgroud)
您需要了解@property等等如何运作。
从文档中,请务必为附加函数指定与原始属性相同的名称
class Game(object):
''' Creates a new game.'''
current_room = None # Class-level definition of this property.
def __init__(self):
print("Created a new Game object.")
self._current_room = FirstRoom()
@property
def current_room(self, room):
''' Returns the current position of the actor.'''
print("Getting the _current_room attribute for the Game object.")
return self._current_room
@current_room.setter # same function name as the property.
def current_room(self, new_room):# same name as the property
''' Sets the current_room property of the Game object.'''
print("Setting the _current_room attribute for the Game object.")
self._current_room=new_room
Run Code Online (Sandbox Code Playgroud)