首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python(六)

Python(六) 發佈於 2019-04-12 本篇,我们说说 Python 面向对象高级编程基本概念。 数据封装、继承和多态只是面向对象程序设计中最基础 3 个概念。...在 Python ,面向对象还有很多高级特性,允许我们写出非常强大功能。本篇,我们会说说多重继承、定制类等概念。...__str__ __str__ 就相当于 Objective-C Description 方法或 C# toString() 方法。..._iter__() 方法,该方法返回一个迭代对象,然后,Python for 循环就会不断调用该迭代对象 __next__() 方法拿到循环下一个值,直到遇到 StopIteration 错误时退出循环...注意,只有在没有找到属性情况下,才调用 __getattr__,已有的属性,比如 name,不会在 __getattr__ 查找。

47710

10-面向对象2

Python,如果你调用len()函数试图获取一个对象长度,实际上,在len()函数内部,它自动去调用该对象__len__()方法,所以,下面的代码是等价: >>> len('ABC') 3...__ = __str__ __iter__ 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python...,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score值: >>> s = Student() >>> s.name...__slots__,所以不能绑定score属性,试图绑定score将得到AttributeError错误。...(args)) 当用户定义一个class User(Model)时,Python解释器首先在当前类User定义查找metaclass,如果没有找到,就继续在父类Model查找metaclass,找到了

1.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

Python学习笔记(七)·面向对象高级编程

数据封装、继承和多态只是面向对象程序设计中最基础 3 个概念。在 Python ,面向对象还有很多高级特性,允许我们写出非常强大功能。 我们会讨论多重继承、定制类、元类等概念。...' 由于'score'没有被放到__slots__,所以不能绑定score属性,试图绑定score将得到AttributeError错误。...但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。 有没有既能检查参数,又可以用类似属性这样简单方式来访问变量呢?对于追求完美的 Python 程序员来说,这是必须要做到!...然后,Python for 循环就会不断调用该迭代对象__next__()方法拿到循环下一个值,直到遇到StopIteration错误时退出循环。...(args)) 当用户定义一个class User(Model)时,Python解释器首先在当前类User定义查找metaclass,如果没有找到,就继续在父类Model查找metaclass,找到了

47920

python简明笔记

Python for 循环与 C 语言中不同。这里 for 循环遍历任何序列(比如列表和字符串)每一个元素。...,可以把属性名称前加上两个下划线__,在python,实例变量名如果以__开头,就变成了一个私有变量(private),内有内部可以访问,外部不可以访问。...可以通过给属性增加相应get、set方法来访问和修改属性值,通过定义方法来访问或修改属性值,可以在方法对参数来做检查,避免传入无效参数 【注意】 在Python,变量名类似__xxx__,...'score'没有被放到__slots__,所以不能绑定score属性,试图绑定score将得到AttributeError错误。...但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。 有没有既能检查参数,又可以用类似属性这样简单方式来访问变量呢?对于追求完美的Python程序员来说,这是必须要做到

2.1K90

10 Python 基础: 如何定制类,这里有答案

除此之外,Pythonclass还有许多这样有特殊用途函数,可以帮助我们定制类。...,然后,Pythonfor循环就会不断调用该迭代对象next()方法拿到循环下一个值,直到遇到StopIteration错误时退出循环。...但是,调用不存在score属性,就有问题了: 当调用不存在属性时,比如score,Python解释器会试图调用getattr(self, 'score')来尝试获得属性,这样,我们就有机会返回score...,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score值: >>> s = Student() >>> s.name...在Python,答案是肯定。 任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。

73760

解决AttributeError: collections.defaultdict object has no attribute iteritems

Python 2,​​iteritems​​方法用于返回字典迭代器对象,可以用于遍历字典键值对。但是在Python 3,​​iteritems​​方法被​​items​​方法替代。...而​​collections.defaultdict​​是Python字典一个子类,继承了Python字典所有方法和属性,因此也没有​​iteritems​​方法。...defaultdict(int)​​对象,并通过访问​​count_dict​​键来自动创建并计数。...它返回一个键-值对迭代器对象,可以用于遍历字典键值对。 在Python 2,字典​​iteritems​​方法返回一个迭代器,可以在循环中使用。...需要注意是,在Python 3,如果我们使用​​iteritems​​方法,会抛出​​AttributeError​​错误。

31910

Python学习 Day 10 str iter getitem getattr call

_str__ __iter__ 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Pythonfor循环就会不断调用该迭代对象...,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score值: >>> s = Student() >>> s.name...if attr=='age': return lambda: 25 只是调用方式要变为: >>> s.age() 25 只有在没有找到属性情况下,才调用__getattr__,...已有的属性,比如name,不会在__getattr__查找。...要让class只响应特定几个属性,我们就要按照约定,抛出AttributeError错误: class Student(object): def __getattr__(self, attr

86830

python 面向对象技巧 定制类

看到类似__slots__这种形如__xxx__变量或者函数名就要注意,这些在Python是有特殊用途。...除此之外,Pythonclass还有许多这样有特殊用途函数,可以帮助我们定制类。...__ = __str__ __iter__ 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python...,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score值: >>> s = Student() >>> s.name...__call__ 一个对象实例可以有自己属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python,答案是肯定

41520

Python 3 之 运算符重载详解

首先,这里每个分片表达式,实质上都是一次把结果存储在内存;另一方面,迭代器则是一次产生一个值,这样使大型结果列表节省了实际空间。其次,分片产生对象,其实我们没有对同一个对象进行多处循环。...(attr + 'not allowed') AttributeError: namenot allowed 有两个属性访问重载方法,允许我们控制或特化对象属性访问。...其他属性管理工具 为了方便将来参考,还要注意,有其他方式来管理Python属性访问: __getattribute__方法拦截所有的属性获取,而不仅是那些未定义,但是,当使用它时候,必须必使用...Python 2.6__cmp__方法(已经从Python 3.x移除了) 在Python 2.6,如果没有定义更加具体方法的话,__cmp__方法作为一种退而求其次方法:它整数结果用来计算正在运行运算符...类可能也定义了赋予其实例布尔特性方法……在布尔环境Python首先尝试__bool__来获取一个直接布尔值,然后,如果没有该方法,就尝试__len__类根据对象长度确定一个真值。

3.9K10

【已解决】AttributeError: ‘str‘ object has no attribute ‘decode‘(图文教程)

一、Bug描述 今天写Python深度学习时候遇到了问题:AttributeError: ‘str‘ object has no attribute ‘decode‘。...首先我们需要知道AttributeErrorPython是一种常见错误,它发生在你尝试访问一个对象属性或方法,但该对象没有这个属性或方法时。...对于’str’ object has no attribute 'decode’这个错误,它意味着你正在尝试在一个字符串对象上调用decode方法,但字符串本身并没有这个方法。...所以搞清楚原理很重要,在Python 2,字符串默认是字节字符串(str类型),而Python 3字符串默认是Unicode字符串(str类型)。...-8') except AttributeError as e: print(f"发生错误: {e}") 方案二:错误使用decode(代码示例) 如果在Python 3错误地尝试使用decode

30110

Python内置(4)类相关内置

对象本身不受分配或删除影响,只有箭头受其影响。但是现在没有箭头指向第一个物体,让它活着是没有意义。因此,Python“垃圾收集器(gc)”丢掉了它。现在我们只剩下一个object。...dir and vars: 一切都是字典 你有没有想过Python如何存储对象,它们变量及方法?我们知道所有对象都有自己属性和方法,但是Python究竟如何跟踪它们呢?...我们知道,访问和重新分配字典属性是使用索引完成: >>> dictionary = {'property': 42} >>> dictionary['property'] 42 在对象上,它是通过...getters 和 setter 提供了一种在尝试读取或修改对象属性时添加验证或运行一些额外代码方法。...这是通过将属性转换为一组函数来完成:一个函数在您尝试访问属性时运行,另一个函数在您尝试更改其值时运行。

2.4K30

python协程2:yield from 分析

生成器对象会抛出StopIteration异常。异常对象value属性保存着返回值。..., ignore_types=(str, bytes)): for x in items: if isinstance(x, Iterable) and not isinstance...会成为grouper函数yield from表达式值 # 委派生成器 def grouper(results, key): # 这个循环每次都会新建一个averager 实例,每个实例都是作为协程使用生成器对象...# 3 如果调用方法抛出StopIteration异常,获取异常对象value属性,赋值给_r _r = _e.value else: while 1: # 4 运行这个循环时,委派生成器会阻塞...如果调用方法抛出StopIteration异常,获取异常对象value属性,赋值给_r, 退出循环,委派生成器恢复运行。任何其他异常都会向上冒泡,传给委派生成器。

80110

Python3 与 C# 扩展之~基础拓展

(隔代回收) Python解释器设置了某些阀值,当达到了阀值就进行第一轮回收(大概是有循环引用-1,然后看两个相互引用对象现在引用结果是不是都是0,如果都是0说明没有外部引用,那就是垃圾了),不是垃圾移到第二个链表里面...无论何时,如果我们程序一个变量或其他对象引用了目标对象Python将会增加这个计数值,而当程序停止使用这个对象,则Python会减少这个计数值。...刚刚说到例子,我们以一个不是很常见情况结尾:我们有一个“孤岛”或是一组未使用、互相指向对象,但是谁都没有外部引用。...而Python对于一代列表对象处理遵循同样方法,一旦被分配计数值与被释放计数值累计到达一定阈值,Python会将剩下活跃对象移动到二代列表。...通过这种方法,你代码所长期使用对象,那些你代码持续访问活跃对象,会从零代链表转移到一代再转移到二代。通过不同阈值设置,Python可以在不同时间间隔处理这些对象

1.3K40

Python下划线5种含义代码实例解析

当你在该列表搜索__baz时,你会看不到有这个名字变量。 __baz出什么情况了? 如果你仔细观察,你会看到此对象上有一个名为_Test__baz属性。...让我们创建另一个扩展Test类类,并尝试重写构造函数添加现有属性: class ExtendedTest(Test): def __init__(self): super()....事实证明,这个对象甚至没有__baz属性: dir(t2) ['_ExtendedTest__baz', '_Test__baz', '__class__', '__delattr__', '_...例如,在下面的循环中,我们不需要访问正在运行索引,我们可以使用“_”来表示它只是一个临时值: for _ in range(32): … print(‘Hello, World.’)...这样就很方便了,比如你可以在一个解释器会话访问先前计算结果,或者,你是在动态构建多个对象并与它们交互,无需事先给这些对象分配名字: 20 + 3 23 _ 23 print(

67620

我终于把Python中下划线含义弄清楚了(憋了很久了)

_bar 23 看到_bar前一个下划线并没有阻止我们“进入”类并访问该变量值。 这是因为Python单个下划线前缀仅仅是一种约定 但是,前导下划线确实会影响名称从模块导入方式。...当在该列表搜索_baz时,将看到没有具有该名称变量。 那么,到底发生了什么呢? 如果仔细查看,就会看到这个对象上有一个名为_testbaz属性。这是Python解释器应用命名混乱。...让我们创建另一个类,扩展测试类,并尝试重写添加到构造函数现有属性: >>> t2 = ExtendedTest() >>> t2.foo 'overridden' >>> t2....事实证明,这个对象甚至没有一个_baz属性: >>> dir(t2) ['_ExtendedTest__baz', '_Test__baz', '__class__', '__delattr__',...例如,在下面的循环中,我们不需要访问正在运行索引,我们可以使用“_”来表示它只是一个临时值: >>> for _ in range(32): ...

10.1K21

一文教你读懂 Python 异常信息

AttributeError 当你访问一个对象属性,但是这个属性没有在这个对象定义时候,就会引发 AttributeError。...' object has no attribute 'b' AttributeError 错误消息行告诉我们特定对象类型(在本例为 int)没有访问属性, 在这个例子属性为 b。...: 'tuple' object has no attribute 'append' 这里尝试给 a_list 对象进行 append 操作但是引发了异常, 这里错误信息说,tuple 对象没有...这是因为 SyntaxError 是在 Python 尝试解析代码时引发,实际上代码并没有执行。...前两个示例尝试将字符串和整数相加。然而,它们有细微不同 第一个是尝试在 int 拼接一个 str。 第二个是尝试str 拼接一个 int。 错误消息行反映了这些差异。

2.4K10

Python入门 (二)

访问限制: 在Python,实例变量名如果以双下划线__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。__xxx__是特殊变量,可以被直接访问。...获取对象信息: 可以使用type()函数获取对象类型信息,返回对应Class类型。基础数据类型int、str等。...,但类所有实例都可以访问到,coding时千万不要对实例属性和类属性使用相同名字。...return 'Student object (name=%s)' % self.name __repr__ = __str__ __iter__方法返回一个迭代对象,or循环就会不断调用该迭代对象...): #通过d.empty访问不存在key时,我们期待抛出AttributeError value = d.empty self.assertTrue('key' in d) #断言d存在key

66720

Python基础 | 新手学Python时常见语法错误和异常

语法错误又称解析错误,是我们在刚接触学习Python 时最容易遇到错误,区区别于异常而言,语法错误非程序执行时逻辑错误; 即使语句或表达式在语法上是正确,但在尝试执行时,它仍可能会引发错误,而这个在执行时检测到逻辑错误被称为异常...AttributeError:当试图使用一个对象没有属性或方法时 In [8]: dic = {'key1':'var1', ...: 'key2':'var2'} In [9...通常我们在编写循环访问序列元素时候容易出现此类越界问题。...断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达EOF 标记 EnvironmentError 操作系统错误基类 IOError 输入/输出操作失败...) KeyError 映射中没有这个键 MemoryError 内存溢出错误(对于Python 解释器不是致命) NameError 未声明/初始化对象 (没有属性) UnboundLocalError

7K41

Python自学成才之路 魔术方法之属性访问控制

Python中提供了一些魔术方法来控制对象属性访问,赋值,删除过程。...__无论属性是否存在都会被调用,item参数就是要访问属性。...(item + "属性不存在") AttributeError: age属性不存在 案例__setattr__方法控制添加属性和给属性赋值过程,通过birth_date属性来计算出age属性值。...在使用这些访问控制魔术方法需要注意一点,不能通过self.xxx(备注:这里指的是访问控制魔术方法)方式来访问,这样可能会导致死循环。...__dict__方式来访问或修改属性,这种方式看上去可行,但是存在一个问题,因为self.__dict__本身也是对象属性(只是这个属性比较特殊,它存放了对象其它属性),所以每次访问self.

51020
领券