社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

mikkelnm • 3 年前 • 1354 次点击  

在这段代码中,我试图创建一个公文包对象,该对象有一个方法可以生成该类的新实例 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
 
1354 次点击  
文章 [ 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)]