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 ...
随机推荐
- 从Java视角理解CPU缓存(CPU Cache)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...
- LogMiner详细讲解
原文地址:LogMiner 一.LogMiner的用途 日志文件中存放着所有进行数据库恢复的数据,记录了针对数据库结构的每一个变化,也就是对数据库操作的所有DML语句. 在Oracle 8i之前,Or ...
- bzoj4447 SCOI2015 小凸解密码 password
传送门:bzoj4447 题解: 调试简直恶心,不过调完发现其实还是挺好写的. 用\(\mathrm{set}\)维护一段\(0\)区间的左右端点,每次最多修改两个点,所以很好维护. 查询的时候在\( ...
- UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的. 由于数据量很大,本来想用map<string>判重的,结果还是超时了,然 ...
- 重复记录(duplicate records)相关运营数据
MySQL 中查找反复数据,删除反复数据 创建表和測试数据 /* 表结构 */ DROPTABLEIFEXISTS `t1`; CREATETABLEIFNOTEXISTS `t1`( `id` IN ...
- MySQL快捷键
\c clear 放弃正在输入的命令\h help 显示一份命令清单\q exit 或 quit 退出Mysql程序 在linux里面可以使用Ctr+D快捷键\s ...
- Java——(九)IO流
一.流的分类 1.输入流和输出流 按照流的流向来分,可以分为输入流和输出流 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 此处的输入.输出涉及一个方向 ...
- STL的基本使用之关联容器:map和multiMap的基本使用
STL的基本使用之关联容器:map和multiMap的基本使用 简介 map 和 multimap 内部也都是使用红黑树来实现,他们存储的是键值对,并且会自动将元素的key进行排序.两者不同在于map ...
- linux的openfire运行日志配置经历
openfire的日志可以通过/usr/openfire/lib/log4j.xml(与openfire的安装目录有关,我的openfire是安装在/usr/openfire/)的xml配置文件进行设 ...
- 微软企业库Microsoft Enterprise Library的相关文章链接
微软企业库4.1学习笔记 http://blog.csdn.net/anyqu/article/category/1228691/3 黄聪:Enterprise Library 5.0 系列教程 ww ...