Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 面向对象设计中的实例错误_Python 3.x_Oop - Fatal编程技术网

Python 3.x 面向对象设计中的实例错误

Python 3.x 面向对象设计中的实例错误,python-3.x,oop,Python 3.x,Oop,我正在读史蒂文·洛特写的《面向对象编程Python大师》一书 我遇到了以下代码: class Card: def __init__( self, rank, suit ): self.suit= suit self.rank= rank self.hard, self.soft = self._points() class NumberCard( Card ): def _points( self ): retur

我正在读史蒂文·洛特写的《面向对象编程Python大师》一书

我遇到了以下代码:

class Card:
    def  __init__( self, rank, suit ):
        self.suit= suit
        self.rank= rank
        self.hard, self.soft = self._points()
class NumberCard( Card ):
    def _points( self ):
        return int(self.rank), int(self.rank)
class AceCard( Card ):
    def _points( self ):
        return 1, 11
class FaceCard( Card ):
    def _points( self ):
        return 10, 10
我不明白卡片上的
self.\u points()
怎么可能是合法的表达方式

我也在编译器中运行代码,它统计以下错误 卡的实例没有成员点数


完整代码我将其保留为您的错误的要点:这只是一个pylint问题,如果您不执行类似于c=Card(1,2)的操作,就可以了

代码实际上是正确的

它的意思是,您将像调用
n=NumberCard(1,2)
一样调用它,然后它的子类将使用
\uuu init\uuuu
,子类具有函数
\u points

事实上,对于其他语言,通常我们需要在父类中定义一个
\u points
函数。然后,子类可以重写父类中的函数。但是
python
没有那么严格,所以您可以不在父类中定义
\u points
函数,但这样您就可以为其子类而不是父类创建一个对象

总之,google需要的是OOP的
函数重写

基类
Card
函数在没有成员函数时尝试访问成员函数
\u points()
。它的子类都有这样的成员函数,这无助于基类获得这个成员函数。您不能直接实例化
Card
,因为它实际上是一个抽象类

您应该使用
abc
模块将
Card
声明为抽象类,并将
Card声明为抽象方法,并实例化子类:

from abc import ABC, abstractmethod

class Card(ABC):
    def  __init__( self, rank, suit ):
        self.suit= suit
        self.rank= rank
        self.hard, self.soft = self._points()
    @abstractmethod
    def _points(self):
        return None, None
class NumberCard( Card ):
    def _points( self ):
        return int(self.rank), int(self.rank)
class AceCard( Card ):
    def _points( self ):
        return 1, 11
class FaceCard( Card ):
    def _points( self ):
        return 10, 10

a=AceCard(1,2)
print(a.hard, a.soft)

显示如何运行代码的可复制示例。您列出的错误与您在此处显示的内容无关。@MadPhysicator添加了错误图像请不要将文本作为截图发布。到目前为止,您在代码格式化方面做得非常好,请保持更新。您在此处发布的代码只创建类,但从未运行它们。在此显示实际重现错误的代码。我可以复制到我的编辑器中并运行。