私有字段

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()

在不改变原有框架的基础上,增加方法

框架结构:
Test
    backend
           commons.py
    index.py
    lib.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

AssertionError

AttributeError

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 面向对象(补充)的更多相关文章

  1. Pthon面向对象-补充知识

    Pthon面向对象-补充知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.tracemalloc 标准库tracemalloc,可以统计内存使用情况,通过下面的案例可以看出内 ...

  2. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

  3. Day8 面向对象

    一.面向对象和面向过程 各位,我们现在如果要将大象放冰箱,用面向过程怎么实现呢? 1.把大象放到冰箱里 第一步:把冰箱门打开 第二步:把大象放进去 第三步:把门关上 def open_fridge_d ...

  4. Python 面向对象-------补充

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  5. python(25)- 面向对象补充Ⅰ

    一.如何使用类 1.实例化:创建对象 类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征. 例子一 x=int(10) print(x) python中一切 ...

  6. day8数据类型补充,集合,深浅拷贝

    思维导图: 集合的补充:下面的思维导图有一个点搞错了,在这里纠正一下,没有合集,是反交集,^这个是反差集的意思 . 交集&,反交集^,差集-,并集|,然后就是子集和超集 数据类型补充: ''' ...

  7. Python 面向对象补充

    什么是面向对象编程 类 + 对象 class 类: def 函数1(): pass def 函数2(): pass obj是对象, 实例化的过程 obj = 类() obj.函数1() 例1 , 某些 ...

  8. 【学习笔记】--- 老男孩学Python,day8 知识点补充 join,列表不能循环删除,深浅copy

    1. 补充基础数据类型的相关知识点 1. str. join() 把列表变成字符串 2. 列表不能再循环的时候删除. 因为索引会跟着改变 3. 字典也不能直接循环删除. 把要删除的内容记录在列表中. ...

  9. Python面向对象补充以及异常处理

    面向对象相关内容 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(o ...

随机推荐

  1. Android学习之 sildingmenu

    仿SlidingMenu Android抽屉菜单效果drawer menu - appdoll.com Android "多方向"抽屉 - 开源中国社区 自定义Android滑动式 ...

  2. Ural 1519. Formula 1 优美的插头DP

    今天早上学了插头DP的思想和最基础的应用,中午就开始敲了,岐哥说第一次写不要看别人代码,利用自己的理解一点点得写出来,这样才锻炼代码能力!于是下午慢慢地构思轮廓,一点点地敲出主体代码,其实是很磨蹭的, ...

  3. cf 702B

    You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i, j (i < j) that a ...

  4. 【留坑】uva12299

    这么sb的题本来想练练手记过就是过不了 拍半天也没问题 留坑 哪天有空了去linux下面试试 #include<cstdio> #include<cstring> #inclu ...

  5. HTTPClient实现java自动登录人人网

    参考网址: https://passport.csdn.net/account/login  http://www.iteye.com/topic/638206 httpClient http://b ...

  6. 关于session的实现:cookie与url重写

    本文讨论的语境是java EE servlet. 我们都知道session的实现主要两种方式:cookie与url重写,而cookie是首选(默认)的方式,因为各种现代浏览器都默认开通cookie功能 ...

  7. java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误

    java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误. 问题: 创建了一个工 ...

  8. IIS7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。=

    本文转载:http://www.cnblogs.com/ctcx/archive/2012/07/19/2599741.html 在 Microsoft Visual Studio 2010 打开看了 ...

  9. linux ptrace I

    这几天通过<游戏安全--手游安全技术入门这本书>了解到linux系统中ptrace()这个函数可以实现外挂功能,于是在ubuntu 16.04 x86_64系统上对这个函数进行了学习. 参 ...

  10. [转] 一个资深iOS开发者对于React Native的看法

    当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...