Python 3如何将循环与类一起使用



我正在锦标赛中创建一个卖家/买家模拟,以查看卖家是否接受或拒绝买家的报价。

我已经为卖家和买家制定了几个策略,并将其写成了类。每个买家类都有一个返回特定报价的offer方法,卖家类有一个接收买家报价的review方法,如果报价在他们接受的"阈值"内,它就会被移到一个空数组中。数组越满,"接受"的次数就越多。

我还添加了id属性,以便能够更多地关注锦标赛中的玩家

卖家类别示例:

def __init__(self):
self.offer_history = []

def review(self, offer):
self.offer_history.append(offer)
return offer > twoThirdsOfPrice

def idcode(self):
self.idcode = 11 

买方级示例

class offerLow():        
def offer(self):
return (thirdOfPrice * random.random())

def idcode(self):
self.idcode = 21

我正试图创建一个围绕这些不同策略的锦标赛,让每个卖家都扮演每个报价人。这是迄今为止的锦标赛。我一直收到像这样的错误

offer() missing 1 required positional argument: 'self'

我想我对如何让这个循环发挥作用有些误解。

offerer_strategies = [offerLow, offerMed, offerHigh, randomLowerHalf, alwaysHalf, lowButReasonable, luckTester, 
takeTheAverage]
seller_strategies = [acceptLow, acceptMed, acceptHigh, averageHuman]
outcomes = []
n=0
for offerer in offer_strategies:
for seller in seller_strategies:
n+=1
offerer = offerer_strategies[n]
seller = seller_strategies[n]
score = sum(seller.review(offerer.offer()) for _ in range(500))
outcomes.append(concat(seller.idcode, offerer.idcode), score)

您的类offerLow有两个实例方法offeridcode,但没有用于初始化实例的__init__方法。您可以添加@staticmethod装饰器来使代码正常工作。像这样:

class offerLow():
@staticmethod
def offer(self):
return (thirdOfPrice * random.random())

@staticmethod
def idcode(self):
self.idcode = 21

有关实例方法、类方法和静态方法的详细信息:https://realpython.com/instance-class-and-static-methods-demystified/

最新更新