一、强调引用的概念在面向对象开发中,引用的概念是同样适用的。在python中使用类创建对象后,tom变量中仍然记录的是对象在内存中的地址,也就是tom变量引用了新建的猫对象。..._2和black是同一个对象同一个猫,因为从执行结果可以看出对象的地址是一样的图片在第22行代码中,在内存中为black分配一个小格子,然后把black这个标签贴在了这个小格子身上,在第29行代码,让black...----三、方法中的self参数3.1 案例改造 - 给对象增加属性在python中,要给对象设置属性非常容易,只需要在类的外部的代码中直接通过点.设置一个属性即可,但是不推荐使用,因为对象属性的封装应该封装在类的内部...利用这个断点调试,可以看出,self就是这个tom变量指向的猫对象,可以得出:哪一个对象调用的方法,self就是哪一个对象的引用。再把代码稍作修改如下图:通过self....访问对象的属性可以在利用debugger工具看看执行步骤结果。图片更多相关Python面向对象知识点可关注python自学网
在本文中,作者列举了 5 个初学者常犯的错误,希望它们能帮助初学者写更加正确与优美的代码。 1....可变的缺省参数 Python 中的缺省参数会在执行函数定义时计算一次,这表示在函数完成定义后该表达式只执行一次,因此缺省值可以用于后续的每一次调用。...所以,如果 assert 语句在面向用户验证的产品代码中,根本就不会执行,因为它可能会造成一些安全漏洞。...Python 中是 int 的子类,isinstance(num, int) 同样会得出 True,这并不是我们想要的。...错误的例子: class SitesManager(object): def get_image_tracking_code(self): raise NotImplemented
、字符串(以' 或者 " 括起来)、布尔值(True, False 奇怪为什么用大写)。..._score @score.setterdefscore(self, value):ifnotisinstance(value, int): raise ValueError('score...ifvalue 100: raise ValueError('score must between 0 ~ 100!')self....错误基类是BaseException 常见的错误类型 记录错误,使用python模块logginglogging.exception(exception instance)可以将错误调用对战输出出来 也可以自定义错误类型...可以指定当前输出的method,方法是指定当前输出级别logging.basicConfig(level=logging.INFO) pdb:python -m pdb err.py 开始调试l 查看代码
序列类型 容器类型 能存放不同类型的数据 扁平序列 只能容纳一种类型 不可变序列 slots:限制class能添加的属性 @abstractmethod:含abstractmethod方法的类不能实例化...self, index=-1):# 删除指定索引内容,默认删除最后一个 '''S.pop([index]) -> item -- remove and return item at index...del self[index] return v def remove(self, value):# 删除指定值的内容 '''S.remove(value) -...」可以用来创建其他任何类型的序列 作用域 在python2中会出现变量泄漏的问题,在python3中不会出现 python2 x = 'abc' d = [x for x in 'ABC'] print...生成器表达式 逐个产生元素,更节省内存 与列表推导式类似,不过将[]替换为了() 元祖 有两个作用 不可变的列表 记录没有字段名的内容 拆包 多个变量接收 a, b = (1, 2) print(a,
抛出异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常。...raise 语句 Python中的raise 关键字用于引发一个异常,基本上和C#和Java中的throw关键字相同,如下所示: import traceback def throw_error():...二.传递异常: 捕捉到了异常,但是又想重新引发它(传递异常),可以使用不带参数的raise语句即可: class MufCalc(object): m = False def calc(self,exp...() app.calc(2/0) 三.自定义异常类型: Python中也可以自定义自己的特殊类型的异常,只需要要从Exception类继承(直接或间接)即可: class MyError(Exception...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
dict类型可以说是python里模块的命名空间,实例的属性,函数的关键字参数都有其的参与。...当然还有更简单的,collections模块里的defaultdict或者自己定义一个dict的子类,在子类中实现__missing__方法 1. d = collections.defaultdict...(key) in self.keys() 如果注释掉: if isinstance(key, str): raise KeyError(key) 就会出现如下错误: RecursionError...]: '2' 这样变相的实现了我们需要的值 标准库中字典的变种: collections里的 OrderedDict:在添加键的时候会保持顺序,popitem是默认删除最 ChainMap:可容纳数个不同的映射对象...,在进行键查找时会被作为一个整体查找 Counter:会给键准备一个计数器,用于计数键的更新次数 UesrDict:用纯python实现的dict,常用来方便用户继承 不可变映射类型,实际上可以理解为视图
目录 为什么Python使用缩进来分组语句? 为什么简单的算术运算得到奇怪的结果? 为什么浮点计算不准确? 为什么Python字符串是不可变的? 为什么在方法定义和调用中显式使用“self”?...CPython退出时为什么不释放所有内存? 为什么有单独的元组和列表数据类型? 列表是如何在CPython中实现的? 字典是如何在CPython中实现的? 为什么字典key必须是不可变的?...要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 为什么Python字符串是不可变的? 有几个优点。...如果要强制 Python 在释放时删除某些内容,请使用 atexit 模块运行一个函数,强制删除这些内容。 为什么有单独的元组和列表数据类型?...这没有用的,因为作为可变对象的列表可以包含对自身的引用,然后复制代码将进入无限循环。 允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序中的一类难以跟踪的错误。
常见错误1:滥用表达式作为函数参数的默认值 Python允许开发者指定函数参数的默认值,这也是Python的一大特色,但当默认值可变时,可能会给开发者带来一些困扰。...,在Python中遍历列表或数组时不应该删除该列表(数组)中的元素。...虽然上面代码的错误很明显,但是在编写复杂代码时,资深程序员也难免会犯此类错误。 幸好Python集成了大量经典的编程范式,如果运用得当,可以大大简化代码并提高编程效率。...常见错误9:不熟悉Python2和Python3之间的差异 先来看看foo.py文件中的代码: import sys def bar(i): if i == 1: raise KeyError...下面是处理后的代码,在Python2和Python3中的运行结果一致: import sys def bar(i): if i == 1: raise KeyError(1)
Python中的“类型”属于对象,而不是变量,每个对象都包含有头部信息,比如"类型标示符" "引用计数器"等 """ #共享引用及在原处修改:对于可变对象,要注意尽量不要共享引用...# 删除并返回index处的元素,默认为删除并返回最后一个元素 L.remove(value) # 删除列表中的value...等 #-- 其他 # Python中的真假值含义:1....# reraise the most recent exception #-- Python3.x中的异常链: raise exception from otherException...,比如中文有好几万字 """UTF-8""" # 可变字节数,小于128的字符表示为单个字节,128到0X7FF之间的代码转换为两个字节,0X7FF以上的代码转换为
从细节上看,Python中的列表是由对其它对象的引用组成的连续数组,指向这个数组的指针及其长度被保存在一个列表头结构中。这意味着,每次添加或删除一个元素时,由引用组成的数组需要该标大小(重新分配)。...Python的序列有两种,可变序列和不可变序列并为其提供了两个基类Sequence和MutableSequence,这两个基类存在于内置模块collections.abc中,与其他常见的类如int、list...同样以Python的内置类型list为例进行说明: 实现了__setitem__方法,就可以对列表中的元素进行修改,如a = [1,2],代码a[0]=2就是在调用这个方法 实现了__delitem__...,pop,remove方法,就可以对列表中的元素进行删除,如a = [1,2],代码del a[0]就是在调用__delitem__方法 实现了insert,append,extend方法,就可以在序列中插入元素...[python list pop.png] pop的操作也是需要进行检查缩小,因此也是导致复杂度为O(n) Remove remove函数会指定删除的元素,而该元素可以在列表中的任意位置。
dict,list,set这些是可变类型(用户自定义类型也可变),可以改变类型对象的值;数值和字符串类型则是不可变的。...类型转换 Python中类型转换只需调用相关函数即可 ---- 函数 # 函数定义模板 def func_name([self,][args]): pass def say_hello():...这里贴一篇以前写的文章:Python中的类、对象、继承 Python按引用传递对象,对于不可变对象在修改时会产生新的对象;而对于可变对象,所有的修改都会反映在原有对象上。...魔术方法是Python对象模型的重要部分。 可以动态的给对象/类型添加属性,若给类型添加属性,则该属性在已产生的实例上也是可见的: ? 异常与错误 Python中异常与错误类间关系如下: ?...用了一段时间的Python后,会觉着Python挺有意思的。 最后附上一张,个人总结的语言学习套路: ? 推荐阅读 人生苦短,为什么我要用Python?
__delattr__(self, name) __delattr__与__setattr__很像,只是它定义的是你删除属性时的行为。实现__delattr__是同时要避免"无限递归"的错误。...__dict__[name] = value __delattr__如果在其实现中出现del self.name 这样的代码也会出现"无限递归"错误,这是一样的原因。...__delete__(self, instance) __delete__在其拥有者对其进行删除的时候调用。...如果你希望你的自定义数据结构还支持"可迭代", 那就还需要定义__iter__。 __len__(self) 需要返回数值类型,以表示容器的长度。该方法在可变容器和不可变容器中必须实现。...__getitem__(self, key) 当你执行self[key]的时候,调用的就是该方法。该方法在可变容器和不可变容器中也都必须实现。
要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 为什么Python字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 为什么必须在方法定义和调用中显式使用“self”? 这个想法借鉴了 Modula-3 语言。...如果要强制 Python 在释放时删除某些内容,请使用 atexit 模块运行一个函数,强制删除这些内容。 为什么有单独的元组和列表数据类型?...为什么字典key必须是不可变的? 字典的哈希表实现使用从键值计算的哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。...这没有用的,因为作为可变对象的列表可以包含对自身的引用,然后复制代码将进入无限循环。 允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序中的一类难以跟踪的错误。
要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 04. 为什么 Python 字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 05. 为什么必须在方法定义和调用中显式使用“self”?...如果要强制 Python 在释放时删除某些内容,请使用 atexit 模块运行一个函数,强制删除这些内容。 17. 为什么有单独的元组和列表数据类型?...这没有用的,因为作为可变对象的列表可以包含对自身的引用,然后复制代码将进入无限循环。 允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序中的一类难以跟踪的错误。...总是加上逗号可以避免这个错误的来源。 允许尾随逗号也可以使编程代码更容易生成。
要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 04. 为什么 Python 字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 05. 为什么必须在方法定义和调用中显式使用“self”?...如果要强制 Python 在释放时删除某些内容,请使用 atexit 模块运行一个函数,强制删除这些内容。 17. 为什么有单独的元组和列表数据类型?...这没有用的,因为作为可变对象的列表可以包含对自身的引用,然后复制代码将进入无限循环。 允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序中的一类难以跟踪的错误。...总是加上逗号可以避免这个错误的来源。 允许尾随逗号也可以使编程代码更容易生成
Python中的“类型”属于对象,而不是变量,每个对象都包含有头部信息,比如"类型标示符" "引用计数器"等 """ # 共享引用及在原处修改:对于可变对象,要注意尽量不要共享引用!...删除序列的字符 str1.lstrip(); str1.lstrip('d'); # 删除str1字符串中开头处,位于 d 删除序列的字符 str1.rstrip(); str1.rstrip...删除列表中的value值,只删除第一次出现的value的值 L.reverse() # 反转列表 L.sort(cmp=None, key=None, reverse=False) # 排序列表... class, raise IndexError raise # reraise the most recent exception # -- Python3.x中的异常链: raise exception...,一般用于亚洲的字符集,比如中文有好几万字 """UTF-8""" # 可变字节数,小于128的字符表示为单个字节,128到0X7FF之间的代码转换为两个字节,0X7FF以上的代码转换为3或4个字节