class AttrDict(dict): def __init__(self, *args, **kwargs): super(AttrDict, self).__init__(*args, **kwargs) self.__dict__ = self
时间: 2023-08-03 16:50:29 浏览: 170
这是一个 Python 类的定义,它继承了内置的 `dict` 类。该类的作用是将字典转化为属性访问的形式。在初始化时,它会调用父类的构造函数,然后将自己的 `__dict__` 属性设置为自己,这样就可以使用属性访问来访问字典中的元素。例如,如果有一个字典 `d`,则可以使用 `d.key` 的形式来访问字典中键为 `key` 的值。
相关问题
class Stock: def __init__(self, name, shares, price): self.name = name self.shares = shares self.price = price class MyStock(Stock): def __init__(self, name, shares, price, factor): super().__init__(name, shares, price) self.factor = factor def cost(self): return self.factor * super().cost()
好的,现在我明白你的问题了。下面是一个实现从一个字典列表创建 Stock 实例列表并计算总成本的函数,支持使用 `*args` 和 `**kwargs` 调用:
```python
def create_stock_list(*args, **kwargs):
stocks = []
for stock_dict in args:
stock = Stock(**stock_dict)
stocks.append(stock)
for stock_dict in kwargs.values():
stock = Stock(**stock_dict)
stocks.append(stock)
total_cost = sum([stock.shares * stock.price for stock in stocks])
return stocks, total_cost
```
这个函数接受一个或多个字典作为参数,每个字典包含了一个 Stock 实例的信息,如下所示:
```python
stock_dict = {'name': 'AAPL', 'shares': 100, 'price': 150.0}
```
使用 `*args` 调用时,只需要将字典作为参数传递给函数即可:
```python
stock_dict1 = {'name': 'AAPL', 'shares': 100, 'price': 150.0}
stock_dict2 = {'name': 'GOOG', 'shares': 50, 'price': 1200.0}
stocks, total_cost = create_stock_list(stock_dict1, stock_dict2)
```
使用 `**kwargs` 调用时,需要将字典作为关键字参数传递给函数,如下所示:
```python
stock_dict1 = {'name': 'AAPL', 'shares': 100, 'price': 150.0}
stock_dict2 = {'name': 'GOOG', 'shares': 50, 'price': 1200.0}
stocks, total_cost = create_stock_list(stocks1=stock_dict1, stocks2=stock_dict2)
```
在函数内部,我们使用了两个循环,一个循环用于处理 `*args`,另一个循环用于处理 `**kwargs`。我们使用 `super()` 函数调用父类的 `__init__()` 方法来创建 Stock 实例,然后将其添加到一个列表中。最后,我们计算列表中所有 Stock 实例的总成本,并将其返回。
另外,由于你提到了 `MyStock` 类,并且在 `__init__()` 方法中使用了 `super()` 函数,所以我假设你的实际问题是如何在 `MyStock` 类中计算成本。在这种情况下,你可以在 `MyStock` 类中重载 `cost()` 方法,如下所示:
```python
class MyStock(Stock):
def __init__(self, name, shares, price, factor):
super().__init__(name, shares, price)
self.factor = factor
def cost(self):
return self.factor * super().cost()
```
这个 `cost()` 方法将会使用 `super()` 函数调用父类的 `cost()` 方法,然后将其乘以一个因子,以计算 `MyStock` 实例的成本。
class CumulativeGreedyCoverage(AbstractGreedyAndPrune): choice_dict = {} for ind_uav in range(self.nuavs): uav_residual_rounds = residual_ntours_to_assign[ind_uav] if uav_residual_rounds > 0: uav_tours = self.uavs_tours[ind_uav] for ind_tour in range(len(uav_tours)): tour = uav_tours[ind_tour] quality_tour = self.evaluate_tour(tour, uav_residual_rounds, visited_points) choice_dict[quality_tour] = (ind_uav, ind_tour) best_value = max(choice_dict, key=int) return choice_dict[best_value] def evaluate_tour(self, tour : Tour, round_count : int, visited_points : set): new_points = (set(tour.targets_indexes) - visited_points) return round_count * len(new_points) 如何改写上述程序,使其能返回所有已经探索过的目标点visited_points的数量,请用代码表示
可以将 `visited_points` 作为类成员变量,在每次调用 `evaluate_tour()` 函数时,将探索过的目标点添加到该变量中。然后在 `CumulativeGreedyCoverage` 类中,将所有巡游的 `visited_points` 汇总起来,即可得到所有已经探索过的目标点数量。具体实现如下:
```
class CumulativeGreedyCoverage(AbstractGreedyAndPrune):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.visited_points = set()
def run(self):
choice_dict = {}
for ind_uav in range(self.nuavs):
uav_residual_rounds = residual_ntours_to_assign[ind_uav]
if uav_residual_rounds > 0:
uav_tours = self.uavs_tours[ind_uav]
for ind_tour in range(len(uav_tours)):
tour = uav_tours[ind_tour]
quality_tour = self.evaluate_tour(tour, uav_residual_rounds, self.visited_points)
choice_dict[quality_tour] = (ind_uav, ind_tour)
best_value = max(choice_dict, key=int)
return choice_dict[best_value], self.visited_points
def evaluate_tour(self, tour : Tour, round_count : int, visited_points : set):
new_points = set(tour.targets_indexes) - visited_points
self.visited_points.update(new_points)
return round_count * len(new_points)
```
在 `run()` 函数中,我们新增了一个变量 `self.visited_points` 来记录所有已经探索过的目标点,然后在 `evaluate_tour()` 函数中,我们将探索过的目标点添加到该变量中。最后,我们在 `run()` 函数中返回所有已经探索过的目标点数量。
阅读全文