Py学习  »  Python

在Python中,如何使用方法参数作为新对象的名称?

mikkelnm • 3 年前 • 1493 次点击  

在这段代码中,我试图创建一个公文包对象,该对象有一个方法可以生成该类的新实例 Stock 无论何时购买。我想要 股票 对象将其标记器作为其名称/指针。

所以我真的希望它被解释为 AMZN = Stock() 下面,但我做不到。输出应该是 3000 .我尝试过不同的方法,但都没有成功,所以如果您能给我一些建议,我将不胜感激。这一点很新,所以可能会有一些我不知道的复杂情况。。。

class Stock:
    def __init__(self, ticker, price, amount):
        self.ticker = ticker
        self.price = price
        self.amount = amount

# Create portfolio to hold stocks and available funds
class Portfolio:
    def __init__(self, funds):
        self.funds = funds
        self.stockPortfolio = []

    # Buying a stock and adding it to the portfolio
    def buyStock(self, ticker, price, amount):
        #Add stock to portfolio
        self.stockPortfolio.append(ticker)
        ticker = Stock(ticker, price, amount) # Would like this to be read as AMZN = Stock()
        return


p = Portfolio(100000)
p.buyStock("AMZN", 3000, 20)
print(AMZN.amount)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130657
 
1493 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Blckknght
Reply   •   1 楼
Blckknght    3 年前

可以 做你想做的,但这是一个非常糟糕的主意。

首先,让我们解释一下怎么做。你会想使用 globals() builtin,它会向您返回一个字典,其中包含当前模块中定义的所有全局变量。如果编辑字典,全局变量将被更改。在您的情况下,您希望添加 Stock 对象作为由 ticker 名称这看起来像:

def buyStock(self, ticker, price, amount):
    #Add stock to portfolio
    self.stockPortfolio.append(ticker)
    globals()[ticker] = Stock(ticker, price, amount)  # make a global variable

现在你知道了 怎样 要做到这一点,以下是您可能不应该这么做的原因。像这样使用全局名称空间的问题是,您不能(轻松地)编写期望给定股票代码变量存在的代码。像你这样的台词 print(AMZN.amount) 如果你买了另一只股票就会失败。同样,如果你再购买一批亚马逊股票,你会覆盖 AMZN 使用新的 股票 对象,并且将无法了解您第一次购买的金额,以及您为此支付的价格。

更好的办法是将股票对象放入数据结构中,比如投资组合中已有的列表。这样你就不需要为它使用特定的名称,如果需要的话,你可以用相同的名称购买多个股票。我会用这样的方式:

def buyStock(self, ticker, price, amount):
    #Add stock to portfolio
    self.stockPortfolio.append(Stock(ticker, price, amount))

你可以用打印机打印最近购买的金额 print(p.stockPortfolio[-1].amount) ,或者写一个循环,打印出所有股票(可能还有它们的数量或价值),而不是总是得到第一个。

Pranav Hosangadi
Reply   •   2 楼
Pranav Hosangadi    3 年前

你不愿意吗 AMZN 加入 Portfolio 你创建的对象?考虑一下你拥有多个投资组合的场景,所有的投资组合都拥有AMZN股票。AMZN控股公司应该是谁 AMZN.amount 提到

此外,假设我以3000英镑的价格购买20股AMZN股票,以1500英镑的价格再购买20股AMZN股票,它应该指的是这些购买中的哪一种?它应该给你一个 列表 属于 Stock 那个股票行情器的对象?

我建议你定义 Portfolio.stockPortfolio 作为一个 collections.defaultdict 对象然后,你可以定义一个 __getitem__() 方法 文件夹 以股票代码为例 p["AMZN"] 并从中返回正确的列表 stockPortfolio .如果你真的想使用以下属性访问投资组合的资产 p.AMZN ,你可以定义 __getattr__() 方法然而,我强烈推荐你 不要 这样做是因为@martineau在他们的 comment 上图: Why you don't want to dynamically create variables Keep data out of your variable names.

import collections

class Stock:
    def __init__(self, ticker, price, amount):
        self.ticker = ticker
        self.price = price
        self.amount = amount
        
    def __repr__(self):
        return f"Stock('{self.ticker}', {self.price}, {self.amount})"

# Create portfolio to hold stocks and available funds
class Portfolio:
    def __init__(self, funds):
        self.funds = funds
        self.stockPortfolio = collections.defaultdict(list)
        
# Buying a stock and adding it to the portfolio               
    def buyStock(self, ticker, price, amount):
        #Add stock to portfolio
        stk = Stock(ticker, price, amount)
        self.stockPortfolio[ticker].append(stk)    

    def __getitem__(self, ticker):
        return self.stockPortfolio[ticker]

    def __getattr__(self, ticker):
        return self.stockPortfolio[ticker]

我加了一个 __repr__ 股票 这样我们就可以看到列表中的库存对象包含了什么。

p = Portfolio(100000)

p.buyStock("AMZN", 3000, 20)
print(p["AMZN"])
# Output: [Stock('AMZN', 3000, 20)]

p.buyStock("AMZN", 3500, 10)
print(p.AMZN)
# Output: [Stock('AMZN', 3000, 20), Stock('AMZN', 3500, 10)]