Python面向对象编程:数据访问、模拟私有属性与纸牌模拟案例
立即解锁
发布时间: 2025-08-29 10:27:56 阅读量: 10 订阅数: 24 AIGC 

# Python面向对象编程:数据访问、模拟私有属性与纸牌模拟案例
## 1. 数据访问属性
在Python中,可以使用内置函数`eval`来根据字符串创建并初始化对象。例如,对于`'Time(hour=6, minute=30, second=0)'`这样的字符串,`eval`函数可以将其作为参数,创建一个包含指定值的`Time`对象。
### 1.1 Time类的特殊方法`__str__`
为`Time`类定义了特殊方法`__str__`,当使用内置函数`str`将对象转换为字符串时,会隐式调用该方法。例如,当打印对象或显式调用`str`时,`__str__`方法会创建一个12小时制的字符串,如`'7:59:59 AM'`或`'12:30:45 PM'`。以下是`__str__`方法的实现:
```python
def __str__(self):
"""Print Time in 12-hour clock format."""
return (('12' if self.hour in (0, 12) else str(self.hour % 12)) +
f':{self.minute:0>2}:{self.second:0>2}' +
(' AM' if self.hour < 12 else ' PM'))
```
### 1.2 Time类定义的设计注意事项
#### 1.2.1 类的接口
`Time`类的属性和方法定义了类的公共接口,即程序员应该使用这些属性和方法来与类的对象进行交互。
#### 1.2.2 属性始终可访问
尽管提供了明确定义的接口,但Python并不阻止直接操作数据属性`_hour`、`_minute`和`_second`。与其他面向对象编程语言(如C++、Java和C#)不同,Python中的数据属性不能对客户端代码隐藏。Python教程指出:“Python中没有任何机制可以强制实现数据隐藏,一切都基于约定。”
#### 1.2.3 内部数据表示
可以选择将时间表示为小时、分钟和秒的三个整数值,也可以将时间内部表示为自午夜以来的秒数。即使重新实现`hour`、`minute`和`second`属性,程序员也可以使用相同的接口并获得相同的结果,而无需了解这些更改。
#### 1.2.4 类实现细节的演变
在设计类时,在将类提供给其他程序员之前,应仔细考虑类的接口。理想情况下,设计的接口应使得在更新类的实现细节(即内部数据表示或方法体的实现方式)时,现有代码不会中断。如果Python程序员遵循约定,不访问以单个下划线开头的属性,那么类设计者可以在不破坏客户端代码的情况下演变类的实现细节。
#### 1.2.5 属性
提供同时具有`setter`和`getter`的属性与直接访问数据属性相比,虽然看似没有好处,但实际上存在细微差别。`getter`似乎允许客户端随意读取数据,但它可以控制数据的格式;`setter`可以审查对数据属性值的修改尝试,以防止将数据设置为无效值。
#### 1.2.6 实用方法
并非所有方法都需要作为类接口的一部分。有些方法仅在类内部使用,作为实用方法,不打算成为客户端代码使用的类公共接口的一部分。这些方法应该以单个下划线命名。在其他面向对象语言(如C++、Java和C#)中,这些方法通常实现为私有方法。
### 1.3 datetime模块
在专业的Python开发中,通常会使用Python标准库的`datetime`模块来表示时间和日期,而不是构建自己的类。有关`datetime`模块的更多详细信息,请参阅:https://docs.python.org/3/library/datetime.html
## 2. 模拟“私有”属性
在C++、Java和C#等编程语言中,类会明确声明哪些类成员是公共可访问的,不能在类定义外部访问的类成员是私有的,仅在定义它们的类内部可见。Python程序员经常使用“私有”属性来表示对类的内部工作至关重要,但不属于类公共接口的数据或实用方法。
### 2.1 命名约定
Python对象的属性始终是可访问的,但Python有一个“私有”属性的命名约定。例如,为了防止将`wake_up._hour`设置为无效值,可以将属性命名为`__hour`,使用两个前导下划线。这个约定表明`__hour`是“私有”的,不应该被类的客户端访问。
### 2.2 名称修饰
为了帮助防止客户端访问“私有”属性,Python会对属性名称进行重命名,在属性名称前加上`_ClassName`,例如`_Time__hour`,这称为名称修饰。如果尝试直接赋值给`__hour`,如`wake_up.__hour = 100`,Python会引发`AttributeError`,表示类没有`__hour`属性。
### 2.3 IPython自动补全
在IPython中,当尝试通过按Tab键自动补全像`wake_up.`这样的表达式时,不会显示带有一个或两个前导下划线的属性,只有属于`wake_up`对象“公共”接口的属性才会显示在IPython自动补全列表中。
### 2.4 演示“私有”属性
以下是一个演示“私有”属性的示例:
```python
# private.py
"""Class with public and private attributes."""
class PrivateClass:
"""Class with public and private attributes."""
def __init__(self):
"""Initialize the public and private attributes."""
self.public_data = "public" # public attribute
self.__private_data = "private" # private attribute
```
在IPython中测试:
```python
In [1]: from private import PrivateClass
In [2]: my_object = PrivateClass()
In [3]: my_object.public_data
Out[3]: 'public'
In [4]: my_object.__private_data
-------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-d896bfdf2053> in <module>()
----> 1 my_object.__private_data
AttributeError: 'PrivateClass' object has no attribute '__private_data'
```
虽然直接访问`__private_data`会引发错误,但该属性仍然可以间接访问。
## 3. 案例研究:纸牌洗牌和发牌模拟
### 3.1 测试驱动Card和DeckOfCards类
#### 3.1.1 创建、洗牌和发牌
首先,从`deck.py`导入`DeckOfCards`类并创建一个该类的对象。`DeckOfCards`类的`__init__`方法会按花色和每张花色内的牌面顺序创建52个`Card`对象。可以通过打印`deck_of_cards`对象来查看所有牌的顺序。然后,使用`shuffle`方法洗牌,每次洗牌的结果可能不同。
```python
In [1]: from deck import DeckOfCards
In [2]: deck_of_cards = DeckOfCards()
In [3]: print(deck_of_cards)
Ace of Hearts 2 of Hearts 3 of Hearts 4 of Hearts
5 of Hearts 6 of Hearts 7 of Hearts 8 of Hearts
9 of Hearts 10 of Hearts Jack of Hearts Queen of Hearts
King of Hearts Ace of Diamonds 2 of Diamonds 3 of Diamonds
4 of Diamonds 5 of Diamonds 6 of Diamonds 7 of Diamonds
8 of Diamonds 9 of Diamonds 10 of Diamonds Jack of Diamonds
Queen of Diamonds King of Diamonds Ace of Clubs 2 of Clubs
3 of Clubs 4 of Clubs 5 of Clubs 6 of Clubs
7 of Clubs 8 of Clubs 9 of Clubs 10 of Clubs
Jack of Clubs Queen of Clubs King of Clubs Ace of Spades
2 of Spades 3 of Spades 4 of Spades 5 of Spades
6 of Spades 7 of Spades 8 of Spades
```
0
0
复制全文
相关推荐









