自定义Card类实现存疑:与教程方法不同,请求解析运行逻辑
我来帮你梳理下这段Card类代码的问题,一步步拆解清楚:
你的Card类代码问题分析
先把你写的代码贴出来方便对照:
import random class Card: def __init__(self): self.__value = 0 def deal(self): self.__value(random.randint(1,13)) def set_value(self, value): self.value = set_face_value def get_value(): pass def set_face_value(self): faces = {1: "Ace", 2: "two", 3: "Three", 4: "Four", 5: "Five"...}
1. deal方法的核心错误
你在deal里写了self.__value(random.randint(1,13)),但self.__value是一个整数类型的私有属性,不是方法,不能像函数一样加括号调用。正确的做法是直接给它赋值:
def deal(self): self.__value = random.randint(1,13)
2. set_value方法逻辑完全混乱
这个方法接收了value参数,但却把self.value(注意这里没有双下划线,和初始化的__value不是同一个属性)赋值为set_face_value方法本身,完全偏离了“设置点数”的初衷。正确的写法应该是把传入的合法值赋值给私有属性:
def set_value(self, value): if 1 <= value <=13: # 加个合法性校验,避免无效点数 self.__value = value else: raise ValueError("牌面点数必须在1到13之间")
3. get_value方法缺少实例参数
Python的类实例方法第一个参数必须是self,你写def get_value():会导致调用时直接报错。而且这个方法的作用应该是返回私有属性的数值,修正后:
def get_value(self): return self.__value
4. set_face_value方法定位模糊
从名字看,这个方法应该是把数字点数转换成对应的英文名称,但目前它只定义了字典却没有返回值,也没和实例属性关联。建议改成get_face_value方法,用来返回点数对应的英文面值:
def get_face_value(self): faces = { 1: "Ace", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine", 10: "Ten", 11: "Jack", 12: "Queen", 13: "King" } return faces.get(self.__value, "Unknown")
修正后的完整可运行代码
import random class Card: def __init__(self): self.__value = 0 # 初始化私有点数属性 def deal(self): # 发牌时随机生成1-13的点数 self.__value = random.randint(1, 13) def set_value(self, value): # 设置点数,加合法性校验 if isinstance(value, int) and 1 <= value <= 13: self.__value = value else: raise ValueError("点数必须是1到13之间的整数") def get_value(self): # 获取数字形式的点数 return self.__value def get_face_value(self): # 获取点数对应的英文名称 faces = { 1: "Ace", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine", 10: "Ten", 11: "Jack", 12: "Queen", 13: "King" } return faces.get(self.__value, "Unknown")
运行逻辑说明
- 初始化
Card实例时,私有属性self.__value被设为0; - 调用
deal()方法会随机给self.__value赋值1-13的整数; - 用
set_value(num)可以手动设置合法的点数; get_value()返回数字形式的点数;get_face_value()返回对应的英文面值,比如点数1返回"Ace",11返回"Jack"等。
内容的提问来源于stack exchange,提问作者SpaceCadet
相关产品推荐
相关产品推荐

