Python Customer类实现疑问:客户校验、折扣处理及类初始化咨询
Python Customer类入门问题与解答
我的问题
刚学Python类对象,要完成一个入门级Customer类任务,写了代码但有三个疑问:
(a) 如何实现检查现有客户的方法?
(b) 需求没明确现有客户的折扣力度,有没有通用处理方案?
(c) 类对象初始化是否正确?我觉得应该这么调用:
c = Customer('Timmy') c.customer_details() c.get_discount()
调用各方法时要不要传入属性参数?
Customer类需求
所有客户有唯一ID和姓名,现有客户可享受折扣。编写Customer类需满足:
(i) 包含ID和name属性
(ii) 构造方法接收ID和name作为参数
(iii) 为类属性添加合适的getter/访问方法
(iv) 实现空的父类方法get_discount(self, price)
现有尝试代码
class Customer: def __init__(self, customer_name, customer_id, price): self.customer_name = customer_name self.customer_id = customer_id self.price = price def customer_details(self, customer_name, customer_id): self.customer_name = customer_name self.customer_id = customer_id def get_discount(self, price): self.price = price pass
问题解答
(a) 实现检查现有客户的方法
可以给Customer类加一个类属性存储所有已创建的客户实例,再写个类方法用来检查指定ID/姓名的客户是否存在:
class Customer: # 类属性:存储所有客户实例 all_customers = [] def __init__(self, customer_id, customer_name): self.customer_id = customer_id self.customer_name = customer_name # 初始化时自动把实例加入列表 Customer.all_customers.append(self) # 类方法:按ID检查客户是否存在 @classmethod def is_existing_customer(cls, target_id): return any(cust.customer_id == target_id for cust in cls.all_customers)
调用示例:
c1 = Customer('001', 'Timmy') print(Customer.is_existing_customer('001')) # 输出True print(Customer.is_existing_customer('002')) # 输出False
(b) 折扣力度的通用处理方案
需求没明确的话,有几种通用思路可选:
- 默认值+自定义:给
get_discount设默认折扣比例,同时允许传入自定义值:def get_discount(self, price, discount_rate=0.1): # 默认10%折扣,返回折后价 return price * (1 - discount_rate) - 类属性统一管理:把折扣设为类属性,方便后续统一修改:
class Customer: DEFAULT_DISCOUNT = 0.1 # 默认10%折扣 # ...其他代码 def get_discount(self, price): return price * (1 - self.DEFAULT_DISCOUNT) - 继承扩展:后续可以创建
ExistingCustomer子类,重写get_discount方法来定义不同的折扣规则,灵活性更高。
(c) 初始化与方法调用的正确性
你的初始化和调用方式都有问题,修正如下:
- 初始化错误:原构造方法多了
price参数(需求里构造只需要ID和姓名),要删掉;参数顺序要和调用匹配。 - 方法调用错误:
customer_details如果是用来展示客户信息,不需要传参数(属性已经存在实例里);get_discount需要传price参数(按需求定义)。
修正后的类和调用示例:
class Customer: def __init__(self, customer_name, customer_id): self.customer_name = customer_name self.customer_id = customer_id # getter方法:获取姓名 def get_name(self): return self.customer_name # getter方法:获取ID def get_id(self): return self.customer_id # 展示客户详情,无需传参 def customer_details(self): print(f"客户ID:{self.customer_id},姓名:{self.customer_name}") # 按需求实现空的父类方法 def get_discount(self, price): pass # 空实现,后续子类可重写 # 正确调用方式 c = Customer('Timmy', '001') c.customer_details() # 输出:客户ID:001,姓名:Timmy c.get_discount(100) # 传入price参数,执行空方法
如果想简化getter,也可以用Python的@property装饰器:
class Customer: def __init__(self, customer_name, customer_id): self._customer_name = customer_name self._customer_id = customer_id @property def name(self): return self._customer_name @property def id(self): return self._customer_id # ...其他方法不变
内容的提问来源于stack exchange,提问作者ok cool
相关产品推荐
相关产品推荐

