gpt4 book ai didi

Python抽象方法默认逻辑,super()方法

转载 作者:太空宇宙 更新时间:2023-11-03 15:15:25 26 4
gpt4 key购买 nike

我来自 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() 和继承的例子都超出了我的理解范围,我想我需要有人帮我简化它。

最佳答案

首先,我真诚地希望这只是为了学习目的而不是实际的生产代码。将未经处理的用户输入传递到查询字符串中相当于完整的 SQL injection attack .

既然这样……

抽象类通常用于定义接口(interface),而不是具体的功能。不管怎样,对于您想要做的事情,仅将 query 定义为抽象属性的抽象类将大大简化您的代码。

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()

@abstractproperty
def query(self):
return NotImplemented

def construct_query(self, **external_data):
finalQuery = self.query % external_data
return finalQuery

def run_report(self, **external_data):
self.cursor.execute(self, self.construct_query(**external_data))
results = self.cursor.fetchall()
return results

有了上面的类,那么你只需要有一个像下面这样的子类:

class SheepReport(Report):

@property
def query(self):
return "SELECT COUNT(*) FROM sheep WHERE alive = 1;"

不要介意无条件self.query % external_data。它将使用模板字符串或带有字典数据的纯字符串。

关于Python抽象方法默认逻辑,super()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43926617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com