今日内容

  • 嵌套
  • 特殊方法:__init__
  • type/isinstance/issubclass/super
  • 异常处理

内容回顾

def login():
pass login()
class Account:

    def login(self):
pass obj = Acount()
obj.login()
  1. 谈谈你了解的面向对象?

  2. 类和对象是什么关系?对象是类的一个实例。

    class Foo:
    def __init__(self,name):
    self.name = name
    def run(self):
    pass obj1 = Foo('ale')
    obj2 = Foo('eric')
  3. self是什么?

    # self就是一个形式参数,对象调用方法时,python内部会将该对象传给这个参数。
    class Foo:
    def run(self,num):
    pass obj = Foo()
    obj.run(5)
  4. 类成员 & 对象成员 以及他们之间的关系。

    class Foo:
    name = 'alex'
    def run(self):
    pass obj = Foo()
  5. 类/方法/对象 都可以当作变量或嵌套到其他类型中。

    class Foo:
    def run(self):
    pass v = [Foo,Foo]
    v = [Foo(),Foo()]
    obj = Foo()
    v = [obj.run,obj.run,obj.run]
    class School(object):
    def __init__(self,title):
    self.title = title class Course(object):
    def __init__(self,name,school_object):
    self.name = name
    self.school = school_object class Classes(object):
    def __init__(self,cname,course_object):
    self.cname = cname
    self.course = course_object s1 = School('北京') c1 = Course('Python',s1)
    c2 = Course('Go',s1) cl1 = Classes('全栈1期',c1)
    class School(object):
    def __init__(self,title):
    self.title = title
    def rename(self):
    pass class Course(object):
    def __init__(self,name,school_object):
    self.name = name
    self.school = school_object
    def reset_price(self):
    pass
    class Classes(object):
    def __init__(self,cname,course_object):
    self.cname = cname
    self.course = course_object
    def sk(self):
    pass
    s1 = School('北京') c1 = Course('Python',s1)
    c2 = Course('Go',s1) cl1 = Classes('全栈1期',c1)

内容详细

1.嵌套

  • 函数:参数可以是任意类型。
  • 字典:对象和类都可以做字典的key和value
  • 继承的查找关系
class StarkConfig(object):
pass class AdminSite(object):
def __init__(self):
self.data_list = [] def register(self,arg):
self.data_list.append(arg) site = AdminSite() obj = StarkConfig()
site.register(obj)
class StarkConfig(object):
def __init__(self,name,age):
self.name = name
self.age = age class AdminSite(object):
def __init__(self):
self.data_list = []
self.sk = None def set_sk(self,arg):
self.sk = arg site = AdminSite() # data_list = [] site.set_sk(StarkConfig)
sk = StarkConfig
site.sk('alex',19)
class StackConfig(object):
pass class Foo(object):
pass class Base(object):
pass class AdminSite(object):
def __init__(self):
self._register = {} def registry(self,key,arg):
self._register[key] = arg site = AdminSite()
site.registry(1,StackConfig)
site.registry(2,StackConfig)
site.registry(3,StackConfig)
site.registry(4,Foo)
site.registry(5,Base) for k,v in site._register.items():
print(k,v() )
class StackConfig(object):
pass class UserConfig(StackConfig):
pass class AdminSite(object):
def __init__(self):
self._register = {} def registry(self,key,arg=StackConfig):
self._register[key] = arg def run(self):
for key,value in self._register.items():
obj = value()
print(key,obj)
site = AdminSite()
site.registry(1)
site.registry(2,StackConfig)
site.registry(3,UserConfig)
site.run()
class StackConfig(object):
list_display = '李邵奇' class UserConfig(StackConfig):
list_display = '利奇航' class AdminSite(object):
def __init__(self):
self._register = {} def registry(self,key,arg=StackConfig):
self._register[key] = arg def run(self):
for key,value in self._register.items():
obj = value()
print(key,obj.list_display)
site = AdminSite()
site.registry(1)
site.registry(2,StackConfig)
site.registry(3,UserConfig)
site.run()
class StackConfig(object):
list_display = '李邵奇' def changelist_view(self):
print(self.list_display) class UserConfig(StackConfig):
list_display = '利奇航' class AdminSite(object):
def __init__(self):
self._register = {} def registry(self,key,arg=StackConfig):
self._register[key] = arg def run(self):
for key,value in self._register.items():
obj = value()
obj.changelist_view()
site = AdminSite()
site.registry(1)
site.registry(2,StackConfig)
site.registry(3,UserConfig)
site.run()

2.特殊成员

2.1 __init__

class Foo:
"""
类是干啥的。。。。
"""
def __init__(self,a1):
"""
初始化方法
:param a1:
"""
self.a1 = a1 obj = Foo('alex')

2.2 __new__

class Foo(object):
def __init__(self):
"""
用于给对象中赋值,初始化方法
"""
self.x = 123
def __new__(cls, *args, **kwargs):
"""
用于创建空对象,构造方法
:param args:
:param kwargs:
:return:
"""
return object.__new__(cls) obj = Foo()

2.3 __cal__

class Foo(object):
def __call__(self, *args, **kwargs):
print('执行call方法') # obj = Foo()
# obj()#对象后面加括号,执行的是类中的__call__方法。
Foo()()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_server def func(environ,start_response):
start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
return ['你好'.encode("utf-8") ] class Foo(object): def __call__(self, environ,start_response):
start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])
return ['你<h1 style="color:red;">不好</h1>'.encode("utf-8")] # 作用:写一个网站,用户只要来方法,就自动找到第三个参数并执行。
server = make_server('127.0.0.1', 8000, Foo())
server.serve_forever()

2.4 __getitem__ __setitem__ __delitem__

class Foo(object):

    def __setitem__(self, key, value):
pass def __getitem__(self, item):
return item + 'uuu' def __delitem__(self, key):
pass obj1 = Foo()
obj1['k1'] = 123 # 内部会自动调用 __setitem__方法
val = obj1['xxx'] # 内部会自动调用 __getitem__方法
print(val)
del obj1['ttt'] # 内部会自动调用 __delitem__ 方法

2.5 __str__

class Foo(object):
def __str__(self):
"""
只有在打印对象时,会自动化调用此方法,并将其返回值在页面显示出来
:return:
"""
return 'asdfasudfasdfsad' obj = Foo()
print(obj)
class User(object):
def __init__(self,name,email):
self.name = name
self.email = email
def __str__(self):
return "%s %s" %(self.name,self.email,)
user_list = [User('二狗','2g@qq.com'),User('二蛋','2d@qq.com'),User('狗蛋','xx@qq.com')]
for item in user_list:
print(item)

2.6 __dict__

class Foo(object):
def __init__(self,name,age,email):
self.name = name
self.age = age
self.email = email obj = Foo('alex',19,'xxxx@qq.com')
print(obj)
print(obj.name)
print(obj.age)
print(obj.email)
val = obj.__dict__ # 去对象中找到所有变量并将其转换为字典
print(val)

2.7 上下文管理【面试题】

class Foo(object):
def __enter__(self):
self.x = open('a.txt',mode='a',encoding='utf-8')
return self.x
def __exit__(self, exc_type, exc_val, exc_tb):
self.x.close() with Foo() as ff:
ff.write('alex')
ff.write('alex')
ff.write('alex')
ff.write('alex')
# class Context:
# def __enter__(self):
# print('进入')
# return self
#
# def __exit__(self, exc_type, exc_val, exc_tb):
# print('推出')
#
# def do_something(self):
# print('内部执行')
#
# with Context() as ctx:
# print('内部执行')
# ctx.do_something() class Foo(object):
def do_something(self):
print('内部执行') class Context:
def __enter__(self):
print('进入')
return Foo() def __exit__(self, exc_type, exc_val, exc_tb):
print('推出') with Context() as ctx:
print('内部执行')
ctx.do_something()

2.8 两个对象相加

val = 5 + 8
print(val) val = "alex" + "sb"
print(val) class Foo(object):
def __add__(self, other):
return 123 obj1 = Foo()
obj2 = Foo()
val = obj1 + obj2
print(val)

特殊成员:就是为了能够快速实现执行某些方法而生。

3.内置函数补充

3.1 type,查看类型

class Foo:
pass obj = Foo() if type(obj) == Foo:
print('obj是Foo类的对象')

3.2 issubclass

class Base:
pass class Base1(Base):
pass class Foo(Base1):
pass class Bar:
pass print(issubclass(Bar,Base))
print(issubclass(Foo,Base))

3.3 isinstance

class Base(object):
pass class Foo(Base):
pass obj = Foo() print(isinstance(obj,Foo)) # 判断obj是否是Foo类或其基类的实例(对象)
print(isinstance(obj,Base)) # 判断obj是否是Foo类或其基类的实例(对象)

4.super

class Base(object):
def func(self):
print('base.func')
return 123 class Foo(Base):
def func(self):
v1 = super().func()
print('foo.func',v1) obj = Foo()
obj.func()
# super().func() 去父类中找func方法并执行
class Bar(object):
def func(self):
print('bar.func')
return 123 class Base(Bar):
pass class Foo(Base):
def func(self):
v1 = super().func()
print('foo.func',v1) obj = Foo()
obj.func()
# super().func() 根据类的继承关系,按照顺序挨个找func方法并执行(找到第一个就不在找了)
class Base(object): # Base -> object
def func(self):
super().func()
print('base.func') class Bar(object):
def func(self):
print('bar.func') class Foo(Base,Bar): # Foo -> Base -> Bar
pass obj = Foo()
obj.func() # super().func() 根据self对象所属类的继承关系,按照顺序挨个找func方法并执行(找到第一个就不在找了)

5.异常处理

5.1 基本格式

try:
pass
except Exception as e:
pass
try:
v = []
v[11111] # IndexError
except ValueError as e:
pass
except IndexError as e:
pass
except Exception as e:
print(e) # e是Exception类的对象,中有一个错误信息。
try:
int('asdf')
except Exception as e:
print(e) # e是Exception类的对象,中有一个错误信息。
finally:
print('最后无论对错都会执行') # #################### 特殊情况 #########################
def func():
try:
# v = 1
# return 123
int('asdf')
except Exception as e:
print(e) # e是Exception类的对象,中有一个错误信息。
return 123
finally:
print('最后') func()

5.2 主动触发异常

try:
int('123')
raise Exception('阿萨大大是阿斯蒂') # 代码中主动抛出异常
except Exception as e:
print(e)
def func():
result = True
try:
with open('x.log',mode='r',encoding='utf-8') as f:
data = f.read()
if 'alex' not in data:
raise Exception()
except Exception as e:
result = False
return result

5.3 自定义异常

class MyException(Exception):
pass try:
raise MyException('asdf')
except MyException as e:
print(e)
class MyException(Exception):
def __init__(self,message):
super().__init__()
self.message = message try:
raise MyException('asdf')
except MyException as e:
print(e.message)

python笔记21(面向对象课程三)的更多相关文章

  1. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  2. Python:笔记(3)——面向对象编程

    Python:笔记(3)——面向对象编程 类和面向对象编程 1.类的创建 说明:和Java不同的是,我们不需要显示的说明类的字段属性,并且可以在后面动态的添加. 2.构造函数 构造函数的功能毋庸置疑, ...

  3. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  4. python之路--面向对象(三)

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象.由于Python中一切都是类,所以 ...

  5. 9.Python笔记之面向对象高级部分

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

  6. python基础之面向对象(三))(实战:烤地瓜(SweetPotato))

    一.分析"烤地瓜"的属性和方法 示例属性如下: cookedLevel : 这是数字:0~3表示还是生的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了!我们的 ...

  7. Python笔记之面向对象

    1.类和对象 #create a class class fruit: def say(self): print "hello, python" if __name__ == &q ...

  8. JavaSE 学习笔记之面向对象(三)

    面向对象 特点: 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在人们思考习惯的一种思想.   过程和对象在我们的程序中是如何体现的呢?过程 ...

  9. Python笔记 #21# DHNN

    离散型hopfield神经网络.参考自http://web.cs.ucla.edu/~rosen/161/notes/hopfield.html实现的草稿版本: # http://web.cs.ucl ...

随机推荐

  1. 【php学习】图片处理三步走

    前两天要对一张图片进行处理,其实很简单,就是在图片上加上字符串,一个图片而已,但是自己如同得了短暂性失忆似的,图片操作的函数一个都想不起来.所以就抽空整理了一下图片操作函数. 1. 创建画布 从文件中 ...

  2. 微信小程序之豆瓣电影

    此文是学习小程序第二天做出的一个小demo,调用了豆瓣电影的api,但是需要填上自己appId,现在项目的 目录如下图: 效果图如下: 在这个demo里面,我更改了小程序的navigationBar, ...

  3. 详解定时任务中的 cron 表达式

    1.前言 我们经常使用 cron 表达式来定义定时任务的执行策略,今天我们就总结一下 cron 表达式的一些相关知识. 2. cron 表达式的定义 cron 表达式是一个字符串,该字符串由 6 个空 ...

  4. Android Gradle脚本从Groovy迁移到Kotlin DSL

    Android Gradle从Groovy迁移到Kotlin Android项目用Gradle构建, 其脚本语言之前是Groovy, 目前也提供了Kotlin的支持, 所以可以迁移到Kotlin. 官 ...

  5. Beetlex实现完整的HTTP协议

    在传统网络服务中扩展中需要处理Bytes来进行协议的读写,这种原始的处理方式让工作变得相当繁琐复杂,出错和调试的工作量都非常大:组件为了解决这一问题引用Stream读写方式,这种方式可以极大的简化网络 ...

  6. WiFi模块Demo(新手教程)图文详解模块使用教程

    本文出自APICloud官方论坛,感谢论坛版主 Mr.ZhouHeng 的分享. 第一步我们需要在开发控制台创建一个Native App应用以及添模块的准备工作: 按照下图步骤 输入完点创建完成之后 ...

  7. 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环

    本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...

  8. dp-完全背包

    (  推荐 : http://blog.csdn.net/insistgogo/article/details/11081025 ) 问题描述 : 已知一个容量为 V 的背包 和 N 件物品 , 第 ...

  9. PTA - 拓扑排序

    一个项目由若干个任务组成,任务之间有先后依赖顺序.项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务.现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工 ...

  10. 字典树 (HDU 2072)

    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input有多组数据,每组一行,每组就是 ...