Python 3.x 面向对象设计中的实例错误
我正在读史蒂文·洛特写的《面向对象编程Python大师》一书 我遇到了以下代码: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
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添加了错误图像请不要将文本作为截图发布。到目前为止,您在代码格式化方面做得非常好,请保持更新。您在此处发布的代码只创建类,但从未运行它们。在此显示实际重现错误的代码。我可以复制到我的编辑器中并运行。