在... / CthuluPackage在CthuluCore.py中,我有:
class Dice(object):
@staticmethod
def __RollSkillMenu():
bonus=int(input("Bonus>"))
penalty=int(input("Penalty>"))
return Dice.RollSkill(bonus-penalty)
在CthuluSkills.py,我有
from CthuluPackage.CthuluCore import *
import inspect
class SkillCheckResult(object):
def __init__(self,targetSkill):
self.TargetSkill=targetSkill
print(Dice)
self.Roll=Dice.__RollSkillMenu()
当我尝试创建SkillCheckResult时,我收到消息:
AttributeError: type object 'Dice' has no attribute '_SkillCheckResult__RollSkillMenu'
这让我很困惑,因为据我所知,我不是要打电话给任何名为Dice.SkillCheckResult_RollSkillMenu的东西,我只是想打电话给Dice.RollSkillMenu。为什么python在我的方法调用之前加上这个?
在类主体中出现的任何名称以两个下划线开头并且不以两个下划线结尾自动获得前面的_TheNameOfTheClass
。如此命名的方法或属性应该是类内部的;如果要从子类或其他外部代码访问它们,则必须手动添加_TheNameOfTheClass
前缀。
看起来__RollSkillMenu
不应该是Dice
类的内部。如果是这样,那么不要让名称以两个下划线开头。只需使用一个,或者它应该是公共接口的一部分,根本不使用任何下划线。实际上,您可能需要考虑将其完全移出课堂。
如果它应该是Dice
类的内部,那么停止尝试从SkillCheckResult
访问它。