【问题标题】:Is there a way to short lots of repeated code in a class有没有办法在一个类中缩短大量重复的代码
【发布时间】:2019-12-18 16:33:55
【问题描述】:

我有以下代码:

import matplotlib.pyplot as plt ### imports plotting
import numpy as np
import pandas as pd

class Population:
    def __init__(self,name,population):
        self.name = name
        self.population = population
        self.conservative = self.population * 48/100
        self.labour = self.population * 30/100
        self.libDem = self.population * 12/100
        self.green = self.population * 5/100
        self.brexit = self.population * 3/100
        self.others = self.population * 2/100

    def distribution(self):
        print(self.conservative)
        print(self.labour)
        print(self.libDem)
        print(self.brexit)
        print(self.others)

    def rulingParty(self):
        parties = {"Conservative":self.conservative,"Labour":self.labour,"LibDem":self.libDem,"Green":self.green,"Brexit":self.brexit,"Other":self.others}
        return max(parties, key=parties.get)

    def addCon(self,amount, Lab=1/5,LD=1/5,GRN=1/5,BXT=1/5,Others=1/5):
        self.conservative += amount
        self.labour += -amount * Lab
        self.libDem += -amount * LD
        self.green += -amount * GRN
        self.brexit += -amount * BXT
        self.others += -amount * Others

    def addLab(self,amount, Con=1/5,LD=1/5,GRN=1/5,BXT=1/5,Others=1/5):
        self.labour += amount
        self.conservative += -amount * Con
        self.libDem += -amount * LD
        self.green += -amount * GRN
        self.brexit += -amount * BXT
        self.others += -amount * Others

    def addLD(self,amount, Con=1/5,Lab=1/5,GRN=1/5,BXT=1/5,Others=1/5):
        self.libDem += amount
        self.conservative += -amount * Con
        self.labour += -amount * Lab
        self.green += -amount * GRN
        self.brexit += -amount * BXT
        self.others += -amount * Others

    def addGRN(self,amount, Con=1/5,Lab=1/5,LD=1/5,BXT=1/5,Others=1/5):
        self.green += amount
        self.conservative += -amount * Con
        self.labour += -amount * Lab
        self.libDem += -amount * LD
        self.brexit += -amount * BXT
        self.others += -amount * Others

    def addBXT(self,amount, Con=1/5,Lab=1/5,LD=1/5,GRN=1/5,Others=1/5):
        self.brexit += amount
        self.conservative += -amount * Con
        self.labour += -amount * Lab
        self.libDem += -amount * LD
        self.green += -amount * GRN
        self.others += -amount * Others

    def addOthers(self,amount, Con=1/5,Lab=1/5,LD=1/5,GRN=1/5,BXT=1/5):
        self.others += amount
        self.conservative += -amount * Con
        self.labour += -amount * Lab
        self.libDem += -amount * LD
        self.green += -amount * GRN
        self.brexit += -amount * BXT

c = Population("UK",100000)
d = [c.conservative,c.labour,c.libDem,c.green,c.brexit,c.others]
while not c.rulingParty()=="Labour": 
    c.addCon(-1000)
    d = np.vstack((d,[c.conservative,c.labour,c.libDem,c.green,c.brexit,c.others]))


print(d)
print(np.shape(d)[0])

需要注意的是,这只是我为了提高我的 Python 技能而进行的一项练习,而不是任何形式的政治模拟。我的问题是,有什么办法可以减少 addCon()、addLab() 等函数中重复行的数量,因为它们都有很多相同的代码。

任何反馈将不胜感激 你的,

【问题讨论】:

  • 您可以创建一个字典,其中政党名称作为键,投票作为值。唯一的 add 方法将名称作为参数。然后你遍历 dict 并为给定名称添加,为其他名称减去(还需要一些更多细节)。
  • 你能解释一下这个程序是做什么的吗?这也可能属于 Code Review,而不是这里。
  • addOthers,你为什么要+= -amount * _?为什么不-= amount * _

标签: python python-3.x function class shortcut


【解决方案1】:

绝对有,但需要一点额外的工作。

首先,我不会将libDemconservative 作为类中的字段。相反,我会让它们成为字典中的键,并将投票作为值。有点像你在ruling_party 方法中所做的。但是将字典设置为__init__,然后您可以重写您的方法。

事实上,您可以将它们全部合并到一个方法中:

def add_party(self, party, amount, adjustment_factors):
    self.votes[party] += amount
    for other_party in self.votes:
        if other_party != party:
            factor = adjustment_factors.get(other_party, 1/5)
            self.votes[other_party] -= amount * factor

【讨论】:

  • 如何使用 init 中的值创建字典?
  • self.votes = {'Conservatives': 0, 'libDems': 0, 'Greens': 0, and so on and so forth
  • 或者我猜你会输入你想要的任何初始值而不是 0
  • 最后一个问题,抱歉,我对 Python 还是很陌生,函数中的调整因子参数是什么意思。我应该将它用于什么以及如何使用?
  • 例如,在您的原始方法中,您将传递参数GRN,然后将格林的选票减少amount * GRN。现在,我们只有一个字典 adjustment_factors,而不是每个方都有一个参数(GRNCon 等)。然后我们从字典中得到一个派对的调整因子(使用.get),我们仍然使用1/5作为默认值。虽然如果因子总是相同并且总是1/5 那么它根本不需要参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多