有没有办法缩短 class 中的大量重复代码
Is there a way to short lots of repeated code in a class
我有以下代码:
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() 等函数之间的重复行数,因为它们都有很多相同的代码。
如有任何反馈,我们将不胜感激
你的,
绝对有,但需要一点额外的工作。
首先,我不会将 libDem
和 conservative
作为 class 中的字段。相反,我会让它们成为字典中的键,并将投票作为值。有点像您在 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
我有以下代码:
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() 等函数之间的重复行数,因为它们都有很多相同的代码。
如有任何反馈,我们将不胜感激 你的,
绝对有,但需要一点额外的工作。
首先,我不会将 libDem
和 conservative
作为 class 中的字段。相反,我会让它们成为字典中的键,并将投票作为值。有点像您在 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