day21
1.内容回顾
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)
2.嵌套
-
函数:参数可以是任意类型。
-
字典:对象和类都可以做字典的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 = [] sk = StarkConfig
site.set_sk(StarkConfig)
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() # 你扫起 你扫起 李启舫
3.特殊成员
3.1 __init__()
# 创建类的对象的第二步 为空对象填充值
class Foo:
"""
类是干啥的。。。。
"""
def __init__(self,a1):
"""
初始化方法
:param a1:
"""
self.a1 = a1
obj = Foo('alex')
3.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()
3.3 __cal__()
# 对象加括号 调用cal方法
class Foo(object):
def __call__(self, *args, **kwargs):
print('执行call方法')
# obj = Foo()
# obj()
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()
3.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__ 方法
3.5 __str__()
class Foo(object):
def __str__(self):
"""
只有在打印对象时,会自动化调用此方法,并将其返回值在页面显示出来
:return:
"""
return 'asdfasudfasdfsad'
obj = Foo()
print(obj) # asdfasudfasdfsad
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) # 打印对象 即str的返回值
3.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)
3.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('内部执行2')
#
# with Context() as ctx:
# print('内部执行1')
# ctx.do_something()
class Foo(object):
def do_something(self):
print('内部执行2')
class Context:
def __enter__(self):
print('进入')
return Foo()
def __exit__(self, exc_type, exc_val, exc_tb):
print('推出')
with Context() as ctx:
print('内部执行1')
ctx.do_something()
3.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) # 是add函数的返回值
特殊成员:就是为了能够快速实现执行某些方法而生。
4.内置函数补充
4.1 type() 查看类型
class Foo:
pass
obj = Foo()
if type(obj) == Foo:
print('obj是Foo类的对象')
4.2 issubclass
class Base:
pass
class Base1(Base):
pass
class Foo(Base1):
pass
class Bar:
pass
print(issubclass(Bar,Base)) # False
print(issubclass(Foo,Base)) # True 判断类1是否是类2的子类
4.3 isinstance
class Base(object):
pass
class Foo(Base):
pass
obj = Foo()
print(isinstance(obj,Foo)) # 判断obj是否是Foo类或其基类的实例(对象)True
print(isinstance(obj,Base)) # 判断obj是否是Foo类或其基类的实例(对象)True
4.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() # base.func foo.func 123
# 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() # bar.func foo.func 123
# 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() # bar.func base.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)