私有字段

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. zoj 2100 Seeding

    Seeding Time Limit: 2 Seconds      Memory Limit: 65536 KB It is spring time and farmers have to plan ...

  2. Oracle Hint 详解

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  3. 【设计模式 - 20】之状态模式(State)

    1      模式简介 状态模式的定义: 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.这个模式将状态封装成独立的类,并将动作委托到代表当前状态的类的对象. 状态模式的优点 ...

  4. 淘宝分布式数据层:TDDL[转]

    淘宝根据自己的业务特点开发了TDDL(Taobao Distributed Data Layer 外号:头都大了 ©_Ob)框架,主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制,它是一个 ...

  5. TOJ 2732存钱计划(三)(单源最短路)

    存钱计划(三)   时间限制(普通/Java):1000MS/30000MS     运行内存限制:65536KByte 总提交: 18            测试通过: 16 描述 TZC的店铺比较 ...

  6. iOS-你真的会用UIMenuController吗?(详细)

    UIMenuController的介绍 什么是UIMenuController? UIMenuController是UIKit里面的控件 UIMenuController的作用在开发中弹出的菜单栏 后 ...

  7. Android 实现闹钟功能

      原文地址:Android 实现闹钟功能作者:Android_Learners 一.手机闹钟主要用到了AlarmManager类,AlarmManager类提供了访问系统定时服务的途径,开发人员可以 ...

  8. poj 1821 Fence 单调队列优化dp

    /* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...

  9. 19、XHTML

    XHTML 可扩展超文本标签语言(EXtensible HyperText Markup Language). 是一种 W3C 标准. 更严格,更纯净的HTML代码. 目标是取代HTML代码. XHT ...

  10. 关于一点coding.net与git配合在AndroidStudio/Idea上的使用笔记个的

    编写程序的我们经常需要对我们写的代码做版本控制,或者分支管理,具备类似功能的软件很多,诸如SVN,Git,CVS等等!但配置版本控制服务器(SVN server etc.)是繁琐的并且需要一定的成本! ...