【发布时间】:2017-05-11 22:32:31
【问题描述】:
我来自 Java 世界,我很难理解 super() 方法,因为它与抽象方法相关。
我有一个带有抽象方法的抽象类。这个类的子类负责查询我的 MySQL 数据库并将格式化的报告返回给我。在一半的子类中,它们使用完全相同的逻辑来运行报告。在另一半,每个人都需要自己的逻辑。因此我想让run_report 成为一个抽象方法。
class Report:
__metaclass__ = ABCMeta
def __init__(self):
self.user = 'root'
self.passwd = ''
self.host = '127.0.0.0.1'
self.port = '80'
self.db = 'animals'
self.conn = mysql.connector.connect(user=self.user, password=self.passd, db=self.db, host=self.host, port=self.port)
self.cursor = self.conn.cursor()
@staticmethod
def construct_query(query, external_data):
finalQuery = query % external_data
return finalQuery
@abstractmethod
def run_report(self, query):
self.cursor.execute(self, query)
results = self.cursor.fetchall()
return data
下面是一个使用抽象方法的类的实现示例:
class SheepReport(Report):
query = "SELECT COUNT(*) FROM sheep WHERE alive = 1;"
def run_report(query):
super(Report, self).run_report(query)
这种语法看起来很神秘。我的代码太不完整,目前无法测试运行,我正试图将错误扼杀在萌芽状态。我是否正确理解了抽象方法?
相比之下,这里有一个覆盖 run_report 的类:
class CowReport(Report):
query = "SELECT height, weight FROM cows WHERE name IN (%s);"
def run_report(self):
finalQuery = self.construct_query(query, "'Hilda', 'Gary'");
self.cursor.execute(self, finalQuery)
results = self.cursor.fetchall()
return data
我在正确的轨道上吗?我见过的所有 super() 和继承的例子都让我头疼,我想我需要有人帮我把它弄糊涂。
【问题讨论】:
标签: python inheritance abstract-class super