Day8 面向对象(补充)
私有字段
class Foo:
def __init__(self, name):
self.__name = name
def f1(self):
print(self.__name)
class Bar(Foo):
def f2(self):
print(self.__name)
obj = Foo('alex')
#print(obj.name)
#只能内部调用
obj.f1()
obj2 = Bar('aaa')
obj2.f1()
#私有普通字段只有自己能访问,其余均不行
obj2.f2()
静态方法
class Foo:
__cc = '123'
def __init__(self, name):
self.__name = name
def f1(self):
print(self.__name)
@staticmethod
def f2():
print(Foo.__cc)
# obj = Foo('aaa')
# obj.f2()
Foo.f2()
__getitem,__setitem,__delitem
class Foo:
def __init__(self, name):
self.__name = name
def f1(self):
print(self.__name)
def __getitem__(self, item):
print(type(item))
return 123
def __setitem__(self, key, value):
print('setitem')
def __delitem__(self, key):
print('del item')
obj = Foo('alex')
#obj[]执行__getitem__方法
#语法对应关系
ret = obj['ad']
print(ret)
ret1 = obj[1:2]
print(ret1)
obj['k1'] = 123
del obj['k1']
切片
class Foo:
def __init__(self, name):
self.__name = name
def f1(self):
print(self.__name)
def __getitem__(self, item):
print(item, type(item))
print(item.start)
print(item.stop)
print(item.step)
return 123
def __setitem__(self, key, value):
#key.start key.stop key.step
print(type(key), type(value))
def __delitem__(self, key):
print(type(key))
# key.start key.stop key.step
print('del item')
obj = Foo('alex')
#obj[]执行__getitem__方法
#语法对应关系
#ret = obj['ad']
ret1 = obj[1:4:2]
obj[1:4] = [11, 22, 33, 44, 55]
del obj[1:4]
迭代器
class Foo:
def __iter__(self):
yield 1
yield 2 obj = Foo()
for item in obj:
print(item) #1.obj能被循环,必须被迭代
#2.for循环执行时,默认执行__iter__方法
isinstance和issubclass
#isinstance:obj, Foo(obj类型和obj类型的父类)的实例
#issubclass:是否子类
class Foo:
pass class Bar(Foo):
pass obj = Bar()
ret = isinstance(obj, Foo)
print(ret) ret2 = issubclass(Bar, Foo)
print(ret2)
super
#假设有一大堆代码,现在需要增加功能,不改变原来代码结构的基础上,增加类
#然后执行super方法,super主动去执行父类的方法
class C1:
def f1(self):
print('c1.f1') class C2(C1):
def f1(self):
#主动去执行父类的f1方法
super(C2, self).f1()
print('c2.f1')
#不建议使用该方法
#C1.f1(self) obj = C2()
obj.f1()
在不改变原有框架的基础上,增加方法
框架结构:
Testbackendcommons.pyindex.pylib.py(自己扩展类)settings.py
commons.py
class Foo:
def f1(self):
print('Foo.f1')
settings.py
# Path = 'backend.commons'
# ClassName = 'Foo' Path = 'lib'
ClassName = 'MyFoo'
lib.py
from backend.commons import Foo class MyFoo(Foo):
def f2(self):
print("before")
super(MyFoo, self).f1()
print("after")
index.py
from settings import ClassName
from settings import Path def execute():
#print(ClassName)
#反射获取字符串
model = __import__(Path, fromlist=True)
cls = getattr(model, ClassName)
obj = cls()
obj.f2() if __name__ == '__main__':
execute()
有序字典
class MyDict(dict):
def __init__(self):
self.li = []
super(MyDict, self).__init__()
def __setitem__(self, key, value):
self.li.append(key)
super(MyDict, self).__setitem__(key, value)
def __str__(self):
tmp_list = []
for key in self.li:
value = self.get(key)
tmp_list.append("'%s':%s" % (key, value))
tmp_str = "{" + ",".join(tmp_list) + "}"
return tmp_str
obj = MyDict()
obj['k1'] = 123
obj['k2'] = 345
print(obj)
单例模式
class Foo:
instance = None def __init__(self, name):
self.name = name @classmethod
def get_instance(cls):
if cls.instance:
return cls.instance
else:
obj = cls('alex')
cls.instance = obj
return obj obj = Foo.get_instance()
obj1 = Foo.get_instance()
print(obj)
print(obj1)
异常处理
while True:
num1 = input('num1:')
num2 = input('num2:')
try:
num1 = int(num1)
num2 = int(num2)
result = num1 + num2 #具体捕获异常种类
except KeyError as ex:
print(ex)
except ValueError as ex:
print(ex)
except IndentationError as ex:
print(ex)
#Exception:捕获所有的异常,但不能分辨是哪一种异常
except Exception as ex:
print(ex) #print执行时调用类中的str方法
常用异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
更多异常
ArithmeticError
AssertionErrorAttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
完整错误处理代码块
try:
pass
#有错误执行except
except KeyError as ex:
print(ex)
except ValueError as ex:
print(ex)
except IndentationError as ex:
print(ex)
# Exception:捕获所有的异常,但不能分辨是哪一种异常
except Exception as ex:
print(ex) # print执行时调用类中的str方法
#如果没有报错执行else
else:
pass
#不管是否报错都执行finally
finally:
pass
主动触发异常
try:
#raise Exception('主动错误一下') #self.message = '主动错误一下'
raise ValueError('主动错误一下') # self.message = '主动错误一下'
print(1234)
#有错误执行except
except KeyError as ex:
print(ex)
except ValueError as ex:
print(ex)
except IndentationError as ex:
print(ex)
# Exception:捕获所有的异常,但不能分辨是哪一种异常
except Exception as ex:
print(ex) # print执行时调用类中的str方法,return self.message
#如果没有报错执行else
else:
pass
#不管是否报错都执行finally
finally:
pass
自定义异常
class WangHuafengException(Exception):
def __init__(self, msg):
self.message = msg def __str__(self):
return self.message try:
raise WangHuafengException('我的异常处理')
except WangHuafengException as e:
print(e)
断言
assert 1==2 #设置条件,是否满足,如不满足报错
Day8 面向对象(补充)的更多相关文章
- Pthon面向对象-补充知识
Pthon面向对象-补充知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.tracemalloc 标准库tracemalloc,可以统计内存使用情况,通过下面的案例可以看出内 ...
- python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】
python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...
- Day8 面向对象
一.面向对象和面向过程 各位,我们现在如果要将大象放冰箱,用面向过程怎么实现呢? 1.把大象放到冰箱里 第一步:把冰箱门打开 第二步:把大象放进去 第三步:把门关上 def open_fridge_d ...
- Python 面向对象-------补充
Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...
- python(25)- 面向对象补充Ⅰ
一.如何使用类 1.实例化:创建对象 类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征. 例子一 x=int(10) print(x) python中一切 ...
- day8数据类型补充,集合,深浅拷贝
思维导图: 集合的补充:下面的思维导图有一个点搞错了,在这里纠正一下,没有合集,是反交集,^这个是反差集的意思 . 交集&,反交集^,差集-,并集|,然后就是子集和超集 数据类型补充: ''' ...
- Python 面向对象补充
什么是面向对象编程 类 + 对象 class 类: def 函数1(): pass def 函数2(): pass obj是对象, 实例化的过程 obj = 类() obj.函数1() 例1 , 某些 ...
- 【学习笔记】--- 老男孩学Python,day8 知识点补充 join,列表不能循环删除,深浅copy
1. 补充基础数据类型的相关知识点 1. str. join() 把列表变成字符串 2. 列表不能再循环的时候删除. 因为索引会跟着改变 3. 字典也不能直接循环删除. 把要删除的内容记录在列表中. ...
- Python面向对象补充以及异常处理
面向对象相关内容 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(o ...
随机推荐
- 【PNG格式中文详解】
技术文档(Document) PNG格式 PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性.流式网 ...
- xml学习篇(二) ----JSON 和XML对比
在比较JSON和XML之前,我们先来上一堂关于数据格式的简要历史(更准确的说,是关于XML的始祖): 早在1970年,IBM开发了一种叫Generalized Markup Language的标记语言 ...
- Python基础知识---字典
现在在实习期间,好久没用Python了,今天在做Java项目时用的HashMap让我联想到了Python中的字典,就写一些Python字典的知识吧,复习复习. 字典: key --> valu ...
- 查看mysql数据库及表编码格式
1.查看数据库编码格式 mysql> show variables like 'character_set_database'; 2.查看数据表的编码格式 mysql> show crea ...
- DataFromFile
#region Copyright 2013, Andreas Hoffmann // project location ==> http://datafromfile.codeplex.com ...
- delphi TColorDialog
TColorDialog 预览 实现过程 动态创建和使用颜色对话框 function ShowColorDlg:TColor;begin with TColorDialog.Cre ...
- [JS][jQuery]remove()与 empty()的差别
要用到移除指定元素的时候,发现empty()与remove([expr])都能够用来实现.可细致观察效果的话就能够发现. empty()是仅仅移除了 指定元素中的全部子节点.拿$("p&qu ...
- QDomDocument类
QDomDocument类代表了一个XML文件 QDomDocument类代表整个的XML文件.概念上讲:它是文档树的根节点,并提供了文档数据的基本访问方法. 由于元素.文本节点.注释.指令执行等等不 ...
- 使用navicat 11 出现不能返回存储过程结果的问题
问题: 使用navicat 11 调试存储过程,select返回结果,总是不能返回. 原因: 经google发现,navicat仅支持返回10个resultset,超过则不现实. 解决方法: 减少存储 ...
- ipad itunes 恢复
http://jingyan.baidu.com/article/a3aad71aa58efbb1fa00967c.html http://act.feng.com/wetools/index.php ...