Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态创建实例时如何调用函数?_Python - Fatal编程技术网

Python 动态创建实例时如何调用函数?

Python 动态创建实例时如何调用函数?,python,Python,我是一名Java新手,正在过渡到Python,我一直在尝试在公司和投资者之间开发一种简单化的类似市场的交互。基本上,有100家公司和100名投资者在初始化时以随机值动态创建 class Company: def __init__(self): """ Constructor for the Company object """ self.id: str = uuid.uuid4().hex self.shares_num = random.

我是一名Java新手,正在过渡到Python,我一直在尝试在公司和投资者之间开发一种简单化的类似市场的交互。基本上,有100家公司和100名投资者在初始化时以随机值动态创建

class Company:
    def __init__(self):
        """ Constructor for the Company object """
        self.id: str = uuid.uuid4().hex
        self.shares_num = random.randint(500, 1000)
        self.share_price = Decimal(random.randint(10, 100))

class Investor:
    def __init__(self):
        """ Constructor for the Investor object """
        self.id_inv: str = uuid.uuid1().hex
        self.budget: Decimal = random.randint(50_000, 100_000)
        self.acq_shares = 0

    def sell_shares(self):
        trade = self.budget - Company.get_share_price
        Company.get_shares_num -= 1
        self.acq_shares += 1
        self.set_budget = trade
        return self
函数sell_shares()执行实际销售,即在投资者的资金和公司的股票之间进行交易

然后,这些公司和投资者被放入一个名单,名单上有他们的ID和一份公司股票数据和投资者预算的dict

# dynamic instances of Companies and Investors
comp = [Company() for _ in range(10)]
companies = {c.id: c for c in comp}

inv = [Investor() for _ in range(10)]
investors = {i.id_inv: i for i in inv}
问题是当我调用sell_shares()方法
Investors.sell_shares
时,公司或股票的实例都不会受到影响。除了它不起作用之外,我真的看不出有什么问题。 有没有关于我如何尝试解决这个问题的建议

万分感谢:)


附言:我在标准库中使用Python3.8.2。

可能最大的问题是在类方法中使用可变全局变量。请不要那样做。每次你这样做,总会有一只小猫死

通过让trade()接受公司的关键字参数,然后使用self(指特定的投资者)和关键字参数(指公司的特定实例)进行操作,可以很容易地解决这个问题。不要试图一次访问所有的投资者和公司,因为你的方法只取决于其中一个

import uuid
import random
from decimal import Decimal

class Company:
    def __init__(self):
        """ Constructor for the Company object """
        self.id: str = uuid.uuid4().hex
        self.shares_num = random.randint(500, 1000)
        self.share_price = Decimal(random.randint(10, 100))

class Investor:
    def __init__(self):
        """ Constructor for the Investor object """
        self.id: str = uuid.uuid1().hex
        self.budget: Decimal = random.randint(50000, 100000)
        self.acq_shares = 0

    def trade(self, company):
        trading = self.budget - company.share_price
        company.share_price -= 1
        self.acq_shares += 1

        # this equation is wrong, but I'm not sure entirely what you want to do here
        # this is equivalent to -company.share_price
        company.share_price = trading - self.budget

        self.budget = trading
        return self.id, self.budget 

请注意,这也消除了创建
get\u share\u price()
get\u budget()方法的任何需要

如果,不知何故,我误解了您的设置,您的交易功能确实同时依赖于所有投资者和所有公司,那么不要将其作为类方法。让它成为一个常规函数,在类之外,它接受两个参数,比如so
deftrade(investors,companys):
,因为在这种情况下,它与investor的单个类实例无关

您可以这样测试您的类:

# Generate companies and investors
comp = [Company() for _ in range(10)]
companies = {c.id: c for c in comp} # <-- not sure what this is used for

inv = [Investor() for _ in range(10)]
investors = {i.id: i for i in inv} # <-- not sure what this is used for

# Select an investor and a company
some_investor = inv[random.randint(0,9)]
some_company = comp[random.randint(0,9)]

# Make a trade
some_investor.trade(some_company)

print(some_company.share_price) # prints a negative number
#创建公司和投资者
comp=[Company()表示范围(10)]

companys={c.id:c for c in comp}#请更正代码缩进,并将
trade()
函数移动到它实际位于代码中的任何位置。done@jarmod:)谢谢你的
trade()
代码为什么使用
inv[0]
comp[0]
?相反,您应该使用
self
引用“该投资者”,并将相关的公司对象作为
comp
参数传递给交易方法。交易的不总是
comp[0]
。不,不是。这就是我试图理解Python是如何传递价值的,以及如何嘲笑名单上第一家公司和投资者之间的交易。但是,它没有起作用。另外,我使用getter和setter(由于价格变化,另一个应用程序要求)的事实改变了那里的“自我”,不是吗?我刚刚测试了交换它,结果是“AttributeError:'list'对象没有“self”属性。我真的不知道如何让类实例交互。在看到你的答案之前,我更新了这个问题,所以方法改变了,但是你关于使用公司和投资者作为论据的建议让我的新手们大吃一惊。实际上比我想象的要简单。我发誓,在一个类方法中没有更多的可变变量。行
investors={i.id:i for i in inv}
声明了一个字典,其中id是键,{budget,acquired_shares}是每一行的数据。为了调试,我需要一个所有交互实例的列表。而且,你是100%正确的,我的trade()算法看起来像一场血洗。谢谢大家!没问题。您还可以将变量传递到
\uuuu init\uuuuu(self)
方法中。您可以执行类似于
\uuuuu init\uuuuu(self、id、预算、共享)的操作:self.id=id;self.budget=预算;self.shares=shares
,然后不使用随机变量,您可以在创建Investor()对象时声明预算和股票,方法类似于
some\u Investor=Investor(some\u id,76543,0)
trade()方法并不依赖于所有公司和投资者。但是,这也是trade()保持交易直到市场上没有更多的钱可以购买或出售股票的部分要求。你认为一个嵌套的(哎哟,我知道)会这样吗
另外,
get\u share\u price()
方法是由于公司每次向任何投资者出售10股股票时都会发生价格更新,股价将翻倍。我打算使用[主持人模式]()来实现这一点
再次感谢您的帮助。你是个明星!我很想为每个公司和投资者分别赋值,但毕竟我需要100个,而且代码不会太枯燥。我最初使用这些属性实现了一个构造函数/初始值设定项,但未能为它们分配随机值。尝试使用setter,但它们的工作方式与Java非常不同,而且每次我调用属性时,setter都会生成新的随机值,整个过程变得令人沮丧。伙计,做一个新手很难…!:/我会制作一个单独的函数(或方法)来进行持续交易(你可以称之为
make_trades
trade_all
或其他什么),我会使用一个while循环来确保资金和股票可用,而不是嵌套的for循环。一般来说,组合一组更小、更简单的函数(或方法)要比试图在一个大函数中同时完成所有任务要好得多。