Fie*_*man 6 python attributes field object
我在一个单独的文件中从头开始重写了整个类,一切都神奇地工作,条件等等。所以,我只是将这个类和几个函数从新文件导入到主文件中。我仍然不知道第一次出了什么问题。
请注意,以下问题已在技术上得到解决。您可以在代码底部看到拼写错误。但是,这发现了一个问题,即我的所有条件(if、try 等)都停止运行,这就是我在单独的模块中重新编写该类的原因
我会删除这篇文章,因为它让每个人都无处可去,但这显然不是 Stack Overflow 上的工作方式。
好的,我一直在学习 Python 3.4 并决定做一些功课作为练习。我开始制作一个脚本来模拟两个人的战斗,然后用我学到的任何新东西(例如添加一个 GUI)来扩展它。
脚本开始时很好,但我所做的更改越多,出现的错误就越多。现在到了我无法访问“战斗机”类的任何字段而不抛出错误的地步,例如:
'duelist' object has no attribute '_duelist__health'
Run Code Online (Sandbox Code Playgroud)
除了“ 'duelist' 对象没有属性'_duelist__XXX' ”之外,除了拼写错误之外,我还有 0 个其他错误。不幸的是,谷歌无法帮助解决这个问题,所以这就是我发表我的第一篇 StackOverflow 帖子的原因。
这是第一个错误快乐字段“健康”的类:
class duelist:
def __init__(self):
self.name = "Duelist" #must not be ""
self.health = 5 #must be >0
self.damage = [1, 3] #random attack range. Must be >=0 0 and the first must not be higher.
self.skill = 10 #% chance to pass a skill check. Representative of parrying/dodging. Must be >=0
self.shield = True #can block?
self.shieldE = 80 #max block %. Must be >0
self.agility = 0.5 #rate of attack in seconds. Must be >=0.05
self.precision = 10 #critical hit chance. Must be >=0
self.critical = 2.0 #critical multiplier. Must be >= 1.1
#name
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
if value != "":
self.__name = value
else:
print("Invalid Name.\n")
#name
#health
@property
def health(self):
return self.__health
@health.setter
def health(self, value):
try:
value = value(int)
if value>=1:
self.__health = value
else:
print("Health must be above 0.\n")
except:
print("Invalid Health.\n")
#health
Run Code Online (Sandbox Code Playgroud)
此外,对于那些建议更改字段名称以不包含“ __ ”(或到处包含“ __ ”)的人,这会导致无限循环。准确键入:
class duelist:
def __init__(self):
self.health = 5
@property
def health(self):
return self.__health
@health.setter
def health(self, value):
self.__health = value
D = duelist()
print(D.health)
D.health = 15
print(D.health)
Run Code Online (Sandbox Code Playgroud)
正确返回
5
15
Run Code Online (Sandbox Code Playgroud)
您的代码执行以下操作:
.name =设置里面的值__init__().__name =.name它会读取 getter,并读取.__name而你对问题的描述“我无法访问“战斗机”类的任何字段”,我怀疑是错误的,因为访问一些字段是有效的。
然而,健康却没有,在第 45 行你可以看到:
value = value(int)
Run Code Online (Sandbox Code Playgroud)
代替
value = int(value)
Run Code Online (Sandbox Code Playgroud)
这会导致 getter 抛出异常print("Invalid Health.\n")并且__health不会被设置。
对于self.shield = True,设置器正在尝试执行以下操作:
if value.lower() == 'y':
Run Code Online (Sandbox Code Playgroud)
并且您无法调用lower()布尔值,因此它在尝试调用之前就崩溃了type(value) == bool,并且__shield永远不会被设置。
| 归档时间: |
|
| 查看次数: |
23828 次 |
| 最近记录: |