当前位置: 首页 > 后端技术 > Python

翻译:《实用的Python编程》04_01_Class

时间:2023-03-26 14:52:35 Python

上一节(3.6设计讨论)|下一节(4.2继承)4.1类本节介绍类语句以及如何创建新对象。面向对象编程(OOP)面向对象编程是一种将代码组织成对象集合的编程技术。一个对象包括:数据。属性行为。方法-应用于对象的函数。在本课程中,您使用了面向对象的编程技术。例如,动作列表。>>>nums=[1,2,3]>>>nums.append(4)#方法>>>nums.insert(1,10)#方法>>>nums[1,10,2,3,4]#Data>>>nums是列表(instance)的一个实例。方法(append()和insert())绑定到实例(nums)。class语句使用class语句定义一个新对象。玩家类:def__init__(self,x,y):self.x=x自我。y=y自我。health=100defmove(self,dx,dy):self.x+=dx自我。y+=dydefdamage(self,pts):self.health-=pts简而言之,类是一组对所谓的实例执行各种操作的函数。实例实例是您在程序中操作的实际对象。实例是通过像函数一样调用类来创建的。>>>a=Player(2,3)>>>b=Player(10,20)>>>a和b都是Player类的实例。强调:class语句只是一个定义(它本身什么都不做)。类似于函数定义。实例数据每个实例都有自己的本地数据。>>>a.x2>>>b.x10数据通过_init__()方法初始化。classPlayer:def__init__(self,x,y):#`self`上存储的任何值都是实例数据self.x=xself.y=yself.health=100总数和类型没有限制属性。实例方法应用于对象实例的函数称为实例方法。classPlayer:...#`move`是一个方法defmove(self,dx,dy):self.x+=dxself.y+=dy对象本身总是作为第一个参数传递。>>>a.move(1,2)#将`a`匹配到`self`#将`1`匹配到`dx`#将`2`匹配到`dy`defmove(self,dx,dy):按照惯例,该实例称为self。但是,实际使用的名称并不重要。对象始终作为第一个参数传递。调用这个参数self只是Python编程风格。ClassScope类没有定义名字的范围。玩家类:...defmove(self,dx,dy):self.x+=dx自我。y+=dydefleft(self,amt):move(-amt,0)#否。调用全局“移动”函数self.move(-amt,0)#是。从上面调用方法`move`。如果要对实例进行操作,总是需要显式引用它(例如:self)。练习从这组练习开始,我们将对前面章节中的现有代码进行一系列更改。从练习3.18版本的代码入手非常重要。如果您还没有代码,请转到Solutions/3_18目录并复制它。练习4.1:将对象视为数据结构在第2节和第3节中,我们处理了表示为元组和字典的数据。例如,股票持有量可以表示为这样的元组:s=('GOOG',100,490.10)或像这样的字典:s={'name':'GOOG','shares':100,'price':490.10}您甚至可以编写操作此类数据的函数。例如:defcost(s):returns['shares']*s['price']但是,随着程序规模的不断扩大,您可能希望创建更好的代码组织感。因此,可以定义一个类来表示数据。创建一个名为stock.py的文件并定义一个名为Stock的类来表示个人持有的股票。Stock类具有name、shares和price属性。示例:>>>importstock>>>a=stock.Stock('GOOG',100,490.10)>>>a.name'GOOG'>>>a.shares100>>>a.price490.1>>>创建更多多个Stock对象并对其进行操作。示例:>>>b=stock.Stock('AAPL',50,122.34)>>>c=stock.Stock('IBM',75,91.75)>>>b.shares*b.price6117.0>>>c.shares*c.price6881.25>>>stocks=[a,b,c]>>>stocks[,,]>>>forsinstocks:print(f'{s.name:>10s}{s.shares:>10d}{s.price:>10.2f}')...查看输出...>>>这里需要强调的是,Stock类充当了创建实例对象的工厂。基本上,您可以像调用函数一样调用类来为您创建新对象。此外,必须强调每个对象都是不同的——它们有自己的数据,这些数据与使用它创建的其他对象是分开的。在某种程度上,由类定义的对象类似于字典——它们只是使用完全不同的语法。例如,使用s.name和s.price代替s['name']和s['price']。练习4.2:添加方法一旦有了一个对象,就可以向它添加方法。我们都知道方法是对存储在对象中的数据进行操作的函数。请将cost()和sell()方法添加到Stock对象。它们应该像这样工作:>>>importstock>>>s=stock.Stock('GOOG',100,490.10)>>>s.cost()49010.0>>>s.shares100>>>s.sell(25)>>>s.shares75>>>s.cost()36757.5>>>练习4.3:创建一个实例列表尝试执行以下步骤从列表字典中创建一个Stock实例列表。然后计算总成本:>>>importfileparse>>>withopen('Data/portfolio.csv')aslines:...portdicts=fileparse.parse_csv(lines,select=['name','shares','price'],types=[str,int,float])...>>>portfolio=[stock.Stock(d['name'],d['shares'],d['price'])fordinportdicts]>>>portfolio[,,,,,,]>>>sum([s.cost()forsinportfolio])44671.15>>>练习4.4:请使用类修改report.py程序中的read_portfolio()函数,将股票投资组合读入Stock的实例列表中,如练习4.3所示。完成后,修复(修复)report.py和pcost.py中的所有代码以使用Stock实例而不是字典。提示:您不必对代码进行大量更改,主要是将s['shares']之类的字典访问更改为s.shares。进行此修改后,您应该能够像以前一样运行函数:>>>importpcost>>>pcost.portfolio_cost('Data/portfolio.csv')44671.15>>>importreport>>>report.portfolio_report('Data/portfolio.csv'','Data/prices.csv')NameSharesPriceChange------------------------------------------AA1009.22-22.98IBM50106.2815.18CAT15035.46-47.98MSFT20020.89-30.34GE9513.48-26.89MSFT5020.89-44.21IBM100讨论>第106.348节|目录|下一节(4.2继承)注:完整翻译见https://github.com/codists/practical-python-zh

猜你喜欢