Python 2.7.x - 试图掌握 OOP 和类的窍门

标签 python oop

我打算组织和删节以遵循一个更短的版本,但为了记住 6 个月后的具体细微差别,我按时间顺序保留了它。

from random import *

class Card:
    def __init__(self):
        self.rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
        self.suit = ['s', 'h', 'c', 'd']
        self.card = choice(rank) + choice(suit)

上面的代码在 IDLE 中运行。但是当我执行 >>> c = Card() [enter] 时,我得到了下面的回溯。

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    c = Card()
  File "C:\Current\MY_PYTHON\Py_OOP_progs\scrap2.py", line 7, in __init__
    self.card = choice(rank) + choice(suit)
NameError: global name 'rank' is not defined

这是为什么?如果我将其更改为包含“return self.card”,我也会得到几乎相同的回溯; '返回卡;或“返回”到类定义的末尾。如果我删除“ self ”。来自变量(rank、suit 和 card)的前缀,然后它运行,我可以做 >>> c = Card() [enter];但是当我尝试执行 >>> c.card [enter] 时,我得到了另一个回溯:

Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    c.card
AttributeError: Card instance has no attribute 'card'

...这正是我期望得到的,也是我最初为 rank、suit 和 card 实例变量添加“self”前缀的原因。我想要得到的效果是,当我执行 >>> c = Card() [enter] 时,将 c 的卡片实例变量设置为具有两个随机值:随机等级和随机花色,如原始代码。然后,我应该能够实例化 52 个 Card() 实例并稍后在程序中将它们打印出来。执行此操作的常规方法是什么?注意 - 代码背后没有特别的含义 - 它主要是任意的。我只是还没有克服 OOP 学习曲线,所以与其阅读更多 Material ,不如直接问我的错误,我认为类(class)会更具互动性和令人难忘。是否需要在代码中定义方法?

此外(只是一个猜测),除了获得更多的实践编码类示例等经验之外,阅读 python 中“ namespace ”和“作用域”这两个领域可能与帮助我理解缺点最相关上面的代码?

与上述问题相关的更多实验(事后)......代码:

from random import *

class Card:
    rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
    suit = ['s', 'h', 'c', 'd']
    card = choice(rank) + choice(suit)

...运行正常,除了在实例化 Card() 之后,>>> c.card [enter] 每次总是给出相同的值。我终于有事可做了。代码如下:

class Card:
    global rank
    global suit
    rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
    suit = ['s', 'h', 'c', 'd']

    def make_Card(self):
        card = choice(rank) + choice(suit)
        print card

运行并允许我做:

>>> c = Card()
>>> c.make_Card()
5h
>>> c.make_Card()
4h
>>> c.make_Card()
2s

虽然我不知道。在这最后一段代码中,我是否偶然发现了一种传统的做法,因为我记得(模糊地)经常阅读一些关于在某些情况下大量声明全局变量是糟糕设计的文章?

最佳答案

第一个选项在下一个代码部分:

from random import *

class Card:
    def __init__(self):
        self.rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
        self.suit = ['s', 'h', 'c', 'd']
        self.card = choice(rank) + choice(suit)   

更改为:

self.card = choice(self.rank) + choice(self.suit)   

因为当你说 self.card = choice(rank) + choice(suit) 时变量 ranksuit 不存在,但是self.rankself.suit 确实存在

另一种选择是:

class Card:
    def __init__(self):
        rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
        suit = ['s', 'h', 'c', 'd']
        card = choice(rank) + choice(suit)   
        self.rank = rank
        self.suit = suit
        self.card = card

但我想第一个选项更像 pythonic

关于Python 2.7.x - 试图掌握 OOP 和类的窍门,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20289638/

相关文章:

java - 评估执行相同功能的不同条件的通用方法

php - 处理对象中的复杂结果——异常?

java - 依赖倒置原则(适用于 Java)

java - 当字符串中有重复项时,查找子字符串的中间索引

Python - 附加到在 for 循环内声明的对象列表

python - 使用 setBold 方法在标签中使用粗体字体

Python 缩进错误 : too many levels of indentation

python - Python中有 '?'控制流吗?

python - 在 geopandas 中转换为字符串时几何列被修剪

python - Python中的对象和对象有什么区别?