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

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

时间:2023-03-26 13:57:53 Python

类别|上一节(4.2继承)|下一节(4.4异常)4.3特殊方法Python行为可以通过.本节介绍特殊方法的思想。此外,还讨论了动态属性访问和绑定方法。配置文件类可以定义特殊方法。特殊方法对Python解释器有特殊意义。特殊方法始终以双下划线__开头和结尾,例如__init__。classStock(object):def__init__(self):...def__repr__(self):...虽然有很多特殊的方法,但我们只研究几个具体的例子。字符串转换的特殊方法对象有两种字符串表示形式。>>>fromdatetimeimportdate>>>d=date(2012,12,21)>>>print(d)2012-12-21>>>ddatetime.date(2012,12,21)>>>str()函数创建格式良好、可打印的输出:>>>str(d)'2012-12-21'>>>repr()函数创建冗长的、程序员-定向输出。>>>repr(d)'datetime.date(2012,12,21)'>>>str()和repr()函数都使用类中定义的特殊方法来生成要显示的字符串。类日期(对象):def__init__(自我,年,月,日):自我。年=年自己。月=月自我。day=day#与`str()`一起使用def__str__(self):returnf'{self.year}-{self.month}-{self.day}'#与`repr()`一起使用def__repr__(self):returnf'Date({self.year},{self.month},{self.day})'注意:按照惯例,__repr__()返回一个字符串,当传递给eval()函数时,将重新创建底层对象(译注:eval(repr(obj))==obj)。如果这不起作用,请使用某种人类可读的表示形式。数学运算的特殊方法数学运算涉及的特殊方法如下:a+ba.__add__(b)a-ba.__sub__(b)a*ba.__mul__(b)a/ba.__truediv__(b)a//ba.__floordiv__(b)a%ba.__mod__(b)a<>ba.__rshift__(b)a&ba.__and__(b)一个|ba.__or__(b)a^ba.__xor__(b)a**ba.__pow__(b)-aa.__neg__()~aa.__invert__()abs(a)a.__abs__()元素访问的特殊方法这些是实现容器的特殊方法:len(x)x.__len__()x[a]x.__getitem__(a)x[a]=vx.__setitem__(a,v)delx[a]x.__delitem__(a)您可以在类中使用这些特殊方法。类序列:def__len__(self):...def__getitem__(self,a):...def__setitem__(self,a,v):...def__delitem__(self,a):...方法调用该方法有两个步骤。1.查找:。operator2.方法调用:()operator>>>s=Stock('GOOG',100,490.10)>>>c=s.cost#Lookup>>>c>>>>c()#Methodcall49010.0>>>Boundmethod还没有被函数调用operator()调用过的方法称为boundmethod(译注:boundmethod,如果直译应该译为“绑定方法”,但是,和“类方法”一样,可以省略“of”这个词,译为“绑定方法”。这里的binding不是动词,应该理解为形容词“的结合”)。它对自己生成的实例进行操作:>>>s=Stock('GOOG',100,490.10)>>>s>>>c=s.cost>>>c>>>>c()49010.0>>>使用绑定方法时如果粗心大意,很容易出错。示例:>>>s=Stock('GOOG',100,490.10)>>>print('Cost:%0.2f'%s.cost)Traceback(最后一次调用):文件“”,行1,inTypeError:floatargumentrequired>>>or:f=open(filename,'w')...f.close#哎呀,什么都没做。`f`仍然打开。在这两种情况下,错误都是由于忘记了尾随括号引起的。例如:s.cost()或f.close()。属性访问还有一种访问、操作和管理属性的替代方法。getattr(obj,'name')#同obj.namesetattr(obj,'name',value)#同obj.name=valuedelattr(obj,'name')#同delobj.namehasattr(obj,'name')#测试属性是否存在示例:ifhasattr(obj,'x'):x=getattr(obj,'x'):else:x=None注意:getattr()函数的默认参数非常有用。x=getattr(obj,'x',None)练习练习4.9:更好的输出请修改stock.py文件中定义的Stock对象,以便__repr__()方法生成更有用的输出。示例:>>>goog=Stock('GOOG',100,490.1)>>>googStock('GOOG',100,490.1)>>>修改完成后,看看读取股票投资组合时会发生什么,以及产生什么样的结果。示例:>>>importreport>>>portfolio=report.read_portfolio('Data/portfolio.csv')>>>portfolio...查看输出是什么...>>>练习4.10:使用getattr()'■示例getattr()是另一种读取属性的机制。使用它可以编写极其灵活的代码。首先,试试这个例子:>>>importstock>>>s=stock.Stock('GOOG',100,490.1)>>>columns=['name','shares']>>>forcolnameincolumns:print(colname,'=',getattr(s,colname))name=GOOGshares=100>>>如果仔细观察,你会发现输出的数据完全由columns变量中列出的属性名决定。在tableformat.py文件中,利用这个思路将其扩展到通用函数print_table(),print_table()打印一个表格,显示用户指定的任何对象的属性。与前面的print_report()函数一样,print_table()方法也应该接受一个TableFormatter实例来控制输出格式。它们是这样工作的:>>>importreport>>>portfolio=report.read_portfolio('Data/portfolio.csv')>>>fromtableformatimportcreate_formatter,print_table>>>formatter=create_formatter('txt')>>>print_table(portfolio,['name','shares'],formatter)nameshares----------------------AA100IBM50CAT150MSFT200GE95MSFT50IBM100>>>print_table(portfolio,['name','shares','price'],formatter)namesharesprice--------------------------------AA10032.2IBM5091.1CAT15083.44MSFT20051.23GE9540.37MSFT5065.1IBM10070.44>>>目录|上一节(4.2继承)|NextSection(4.4异常)注:完整翻译见https://github.com/codists/practical-python-zh

猜你喜欢