首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

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

' 由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。...ValueError: score must between 0 ~ 100! 但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。...,类似 list 或 tuple 那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python 的 for 循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值...7.4.5 __call__ 一个对象实例可以有自己的属性和方法,当我们调用实例方法,我们用instance.method()来调用。能不能直接在实例本身上调用呢?....' % name) 当 Python 解释器载入hello模块,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的 class 对象,测试如下: >>> from hello import

47920

python简明笔记

l如果没有异常发生,except 子句 在 try 语句执行完毕后就被忽略了。 l如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。...定义清理行为 try 语句还有另一个可选的 finally 子句,目的在于定义在任何情况下都一定要执行的功能 不管有没有发生异常,finally 子句 在程序离开 try 后都一定会被执行。...'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。...ValueError: score must between 0 ~ 100! 但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。....' % name) 当Python解释器载入hello模块,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象,测试如下: >>> from hello import

2.1K90

python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

,name:jack,age:10 __del__ # del 析构函数 (__init__ 构造函数) # 执行时机:手动删除对象立马执行,或是程序运行结束也会自动执行(垃圾回收机制?)...__call__ # call 调用对象自动执行 # 执行时机:在调用对象自动执行 ---> 对象() class A: # 调用对象自动执行 def __call__(self...,执行 __setattr__ 用 .设置属性执行 __delattr__ 用del 对象.属性 删除属性执行 这几个函数反映了 python解释器是如何实现 ....语法的原理 __getattribute__ 该函数也是用来获取属性 在获取属性如果存在__getattribute__则先执行该函数,如果没有拿到属性则继续调用__getattr__函数,如果拿到了则直接返回...执行 __detitem__ 当你用中括号去删除属性 执行 ''' 需求: 让一个对象支持 点语法来取值,也支持括号取值 ''' class MyDict(dict): def _

64440

Python 弱引用 weakref

引用计数 引用计数会记录给定对象的引用个数,并在引用个数为零收集该对象。由于一次仅能有一个对象被回收,引用计数无法回收循环引用的对象。...循环引用问题 一组相互引用的对象没有被其它对象直接引用,并且不可访问,则会永久存活下来。一个应用程序如果持续地产生这种不可访问的对象群组,就会发生内存泄漏。...如果没有回调或者弱引用的引用不再存在,则此属性的值为 None。 返回对对象的弱引用。...Python 调用一个对象执行的是其类型对象中的 tp_call 函数。...因此,调用弱引用类型对象 weakref 执行的是 weakref 的类型对象,也就是 type 的 tp_call 函数。

1K10

python-__getattr__ 和

4、查找t的父类和祖先类的__dict__中是否有at属性,如果没有执行第4步,如果有则执行如下步骤: ​ 4.1 at是一个non-data descriptor,调用其__get__方法,不是则执行...('NO such attr %s' % item) AttributeError: NO such attr bbbbbb 可见,当我们访问一个没有被定义的属性,仍然会首先调用getattribute...,根据属性查找原则,在实例和类中都没有找到这个属性,于是执行getattr。...回过头来,getattribute会在调用类和实例的属性无条件调用,所以可以用于权限鉴别、日志记录等操作;而getattr会在属性没有被找到的时候执行,因此可以用来做一些兜底的操作,可见这篇博客 另外注意重写...getattribute循环陷阱,返回语句要写成return object.

38820

Python之面向对象高级编程

Python之面向对象高级编程 01 使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是Python的灵活性,...没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttrbuteError的错误。...02 使用@property 在绑定属性,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改,如下: s = Student() s.score = 9999...ValueError: score must between 0 ~ 100! 上面的调用方法虽然看起来比较方便,但是引入了两个函数,看着又略显复杂,没有直接用属性这么直接简单。...有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?

34910

Python面试题之Python面向对象编程汇总

__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 """实际执行效果""" >>>classStudent(object): ......: 'Student' object has no attribute 'score' >>> 由于’score’没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError...,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到...如果我们能写出这样的链式调用: Chain().users('michael').repos __call__ 一个对象实例可以有自己的属性和方法,当我们调用实例方法,我们用instance.method...就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象,测试如下: >>> from hello import Hello >>> h = Hello() >>> h.hello

1.7K30

开源图书《Python完全自学教程》8.7.1下划线

在类的外部检测 Foo 类是否具有 __name 属性,返回了 False ,而检测 book 属性,则返回了 True 。...__python() AttributeError: 'ProtectMe' object has no attribute '__python' 执行到 p....在 code() 方法内,调用了 __python() 方法,在执行 p.code() 得到了正确结果,再次表明被封装的对象只能在类的内部调用。...那么,为什么在命名属性或方法,以双下划线开始就能实现封装呢?其原因在于,Python 解释器会对以这种形式命名的对象重命名,在原来的名称前面增加前缀形如 _ClassName 的前缀。...__name ,Python 解释器没有也不会将 __name 解析为 _Foo__name ,所以在调用__name 就显示 AttributeError

56620

Python 魔法方法之__getattr__(self,name)

前言 当实例对象调用一个不存在的属性,系统通常会报错,那有啥办法避免这种现象么,或者说自定义报错信息,答案是肯定的,我们可以通过定义__getattr__(self,name)魔法方法来实现。...当实例对象调用不存在的属性,如果在类中没重载__getattr__(self,name)方法,则会抛出AttributeError异常,如下所示: >>> class Animal(): ......print('no %s' % name) ... >>> dog = Animal() >>> dog.aa no aa 如上所示,当我们的实例对象访问不存在的属性aa,就自动调用了__getattr...这边也来说下调用__getattr__的详细过程: 1.在对象的实例属性中寻找,找不到执行下一步2.在的类中查找类属性,找不到执行下一步3.在对象的继承链上寻找,找不到执行下一步4.调用__getattr...__ 方法,如果用户没有定义或者还是找不到,抛出AttributeError异常,属性查找失败!

1.5K20

9 Python 基础: 手把手带你梳理对象、继承与多态知识点

总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。 获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?...True >>> getattr(obj, 'y') # 获取属性'y' 19 >>> obj.y # 获取属性'y' 19 如果试图获取不存在的属性,会抛出AttributeError的错误: >>>...多态,python是一门动态语言,没有所谓真正意义上的多态,多态是来自于静态语言 多态的好处就是,当我们需要传入Dog、Cat、Tortoise……,我们只需要接收Animal类型就可以了,因为Dog...ValueError: score must between 0 ~ 100! 但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。...AttributeError: 'Student' object has no attribute 'score' 由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定

1K50

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

解决AttributeError: 'collections.defaultdict' object has no attribute 'iteritems'在进行Python编程,有时候我们会遇到类似于​​...而​​collections.defaultdict​​是Python字典的一个子类,继承了Python字典的所有方法和属性,因此也没有​​iteritems​​方法。...这个类在创建可以指定一个默认的值,在访问不存在的键,会返回默认值而不是抛出​​KeyError​​异常。...创建一个​​defaultdict​​对象,需要传递一个默认值类型作为参数。常见的默认值类型有:​​int​​,​​list​​,​​set​​,​​dict​​等。...它返回一个键-值对的迭代器对象,可以用于遍历字典的键值对。 在Python 2中,字典的​​iteritems​​方法返回一个迭代器,可以在循环中使用。

31710
领券