<p>下面是一种更面向对象的方法来实现上述代码:</p>
<pre><code>import sys
import psycopg2
from datetime import date
from decimal import Decimal
from config import config
class Vitals:
def __init__(self, row):
self.birth = date(1990, 12, 12)
self.today = date.today()
self.years = today.year - birth.year
self.age = today.year - birth.year - ((today.month, today.day) < (birth.month, birth.day))
self.weight = row[2]
self.height = row[3]
self.activity = Decimal(float(row[4]))
self.goal = row[5]
self.fatRatio = row[6]
self.carbohydrateRatio = row[7]
self.proteinRatio = row[8]
def activityText(self):
if self.activity == Decimal(1.20):
return self.activity * 2
def bmr(self):
return (Decimal(10) * self.weight) +
(Decimal(6.25) * self.height) -
(Decimal(5) * self.age) +
Decimal(5)
def tdee(self):
return Decimal(self.bmr() * self.activity)
def net(self):
if self.goal == 1:
return self.tdee() - (self.tdee() * Decimal(0.1))
else:
return self.tdee()
def getDataFromDatabase(sql):
conn = None
try:
params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()
cur.execute(sql)
except (Exception, psycopg2.DatabaseError) as error:
print(error)
return None
return cur.fetchone()
def main():
sql = 'SELECT * FROM testdb.vitals ORDER BY "vitalsID"'
row = getDataFromDatabase(sql)
vitals = Vitals(row)
#Here you can do your stuff with vitals
main()
</code></pre>
<hr/>
<p>可以创建更多对象,并使用不同的值填充它们。我建议将构造函数中的<code>row</code>的值强制转换为适当的类型,如<code>activity</code>转换为十进制。<br/>
我不能保证这个版本会解决你最初的问题,我尝试了另一个解决方案,但因为这个问题有一个正确的答案,这不是我的主要目标</p>
<hr/>
<p>我看到你的帖子说一卡路里的差异是可以接受的,所以我建议创建一个函数,它的treshold为一卡路里,如果两个对象之间的差异小于treshold,则返回true</p>