在...... / 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在我的方法调用之前加上它?
答案 0 :(得分:1)
在类主体中出现的任何名称以两个下划线开头且不以两个下划线结尾,会自动获得_TheNameOfTheClass
前缀。如此命名的方法或属性应该是类内部的;如果要从子类或其他外部代码访问它们,则必须手动添加_TheNameOfTheClass
前缀。
看起来__RollSkillMenu
不应该是Dice
类的内部。如果是这样,那么请不要以两个下划线开头。只需使用一个,或者它应该是公共界面的一部分,根本不使用任何下划线。事实上,你可能想要考虑将它完全移出课堂。
如果 应该是Dice
类的内部,那么请停止尝试从SkillCheckResult
访问它。