python 面向对象
2018-08-31 18:54:02 0 举报
AI智能生成
python 面向对象
作者其他创作
大纲/内容
成员
变量
实例变量
class Foo(object):
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
def func(self):
print(self.a1,self.a2)
obj = Foo(23,12)
obj.func()
print(obj.a2)
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
def func(self):
print(self.a1,self.a2)
obj = Foo(23,12)
obj.func()
print(obj.a2)
类变量
class Foo(object):
content = '类变量'
def func(self):
print(self.content)
print(Foo.content)
obj = Foo()
obj.func()
content = '类变量'
def func(self):
print(self.content)
print(Foo.content)
obj = Foo()
obj.func()
方法
实例方法
class Foo(object):
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
def func(self):
print(self.a1,self.a2)
obj = Foo('a1','a2')
obj.func()
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
def func(self):
print(self.a1,self.a2)
obj = Foo('a1','a2')
obj.func()
类方法
class Foo(object):
@classmethod
def func(cls,x1,x2):
print(cls,x1,x2)
Foo.func(1,2)
@classmethod
def func(cls,x1,x2):
print(cls,x1,x2)
Foo.func(1,2)
静态方法
class Foo(object):
@staticmethod
def func():
print('23333')
Foo.func()
@staticmethod
def func():
print('23333')
Foo.func()
属性
class Foo(object):
@property
def func(self):
print('666')
obj = Foo()
obj.func
@property
def func(self):
print('666')
obj = Foo()
obj.func
特殊成员
__init__
类名() 自动执行__init__
class Foo(object):
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
obj = Foo(1,2)
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
obj = Foo(1,2)
__call__
对象() 自动执行__call__
class Foo(object):
def __call__(self, *args, **kwargs):
print(1111,args,kwargs)
return 123
obj = Foo()
ret = obj(6,4,2,k1=456)
def __call__(self, *args, **kwargs):
print(1111,args,kwargs)
return 123
obj = Foo()
ret = obj(6,4,2,k1=456)
__getitem__
对象['xx'] 自动执行__getitem__
class Foo(object):
def __getitem__(self, item):
print(item)
return 8
obj = Foo()
ret = obj['yu']
print(ret)
def __getitem__(self, item):
print(item)
return 8
obj = Foo()
ret = obj['yu']
print(ret)
__setitem__
对象['xx'] = 11 自动执行__setitem__
class Foo(object):
def __setitem__(self, key, value):
print(key, value, 111111111)
obj = Foo()
obj['k1'] = 123
def __setitem__(self, key, value):
print(key, value, 111111111)
obj = Foo()
obj['k1'] = 123
__delitem__
del 对象[xx] 自动执行__delitem__
class Foo(object):
def __delitem__(self, key):
print(key)
obj = Foo()
del obj['uuu']
def __delitem__(self, key):
print(key)
obj = Foo()
del obj['uuu']
__add__
对象+对象 自动执行__add__
class Foo(object):
def __init__(self, a1, a2):
self.a1 = a1
self.a2 = a2
def __add__(self,other):
return self.a1 + other.a2
obj1 = Foo(1,2)
obj2 = Foo(88,99)
ret = obj2 + obj1
print(ret)
def __init__(self, a1, a2):
self.a1 = a1
self.a2 = a2
def __add__(self,other):
return self.a1 + other.a2
obj1 = Foo(1,2)
obj2 = Foo(88,99)
ret = obj2 + obj1
print(ret)
__enter__ / __exit__
with 对象 自动执行__enter__ / __exit__
class Foo(object):
def __init__(self, a1, a2):
self.a1 = a1
self.a2 = a2
def __enter__(self):
print('1111')
return 999
def __exit__(self, exc_type, exc_val, exc_tb):
print('22222')
obj = Foo(1,2)
with obj as f:
print(f)
print('内部代码')
def __init__(self, a1, a2):
self.a1 = a1
self.a2 = a2
def __enter__(self):
print('1111')
return 999
def __exit__(self, exc_type, exc_val, exc_tb):
print('22222')
obj = Foo(1,2)
with obj as f:
print(f)
print('内部代码')
__new__
构造方法
class Foo(object):
def __init__(self, a1, a2): # 初始化方法
"""
为空对象进行数据初始化
:param a1:
:param a2:
"""
self.a1 = a1
self.a2 = a2
def __new__(cls, *args, **kwargs): # 构造方法
"""
创建一个空对象
:param args:
:param kwargs:
:return:
"""
return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).
obj1 = Foo(1,2)
print(obj1)
obj2 = Foo(11,12)
print(obj2)
def __init__(self, a1, a2): # 初始化方法
"""
为空对象进行数据初始化
:param a1:
:param a2:
"""
self.a1 = a1
self.a2 = a2
def __new__(cls, *args, **kwargs): # 构造方法
"""
创建一个空对象
:param args:
:param kwargs:
:return:
"""
return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).
obj1 = Foo(1,2)
print(obj1)
obj2 = Foo(11,12)
print(obj2)
其他相关
callalble
判断一个对象是否是可执行的
def func():
pass
class Foo(object):
def __call__(self, *args, **kwargs):
pass
def func(self):
pass
obj = Foo()
print(callable(func))
print(callable(Foo))
print(callable(obj))
print(callable(obj.func))
pass
class Foo(object):
def __call__(self, *args, **kwargs):
pass
def func(self):
pass
obj = Foo()
print(callable(func))
print(callable(Foo))
print(callable(obj))
print(callable(obj.func))
反射
getattr
根据字符串形式,去对象中查找成员
from types import FunctionType
import handler
while True:
print("""
系统支持的函数有:
1. f1
2. f2
3. f3
4. f4
5. f5
""")
val = input("请输入要执行的函数:") # val = "f1"
# 错误
# handler.val()
if hasattr(handler,val):
func_or_val = getattr(handler,val) # 根据字符串为参数,去模块中寻找与之同名的成员。
if isinstance(func_or_val,FunctionType):
func_or_val()
else:
print(func_or_val)
else:
print('handler中不存在输入的属性名')
import handler
while True:
print("""
系统支持的函数有:
1. f1
2. f2
3. f3
4. f4
5. f5
""")
val = input("请输入要执行的函数:") # val = "f1"
# 错误
# handler.val()
if hasattr(handler,val):
func_or_val = getattr(handler,val) # 根据字符串为参数,去模块中寻找与之同名的成员。
if isinstance(func_or_val,FunctionType):
func_or_val()
else:
print(func_or_val)
else:
print('handler中不存在输入的属性名')
class Account(object):
func_list = ['login', 'logout', 'register']
def login(self):
"""
登录
:return:
"""
print('登录111')
def logout(self):
"""
注销
:return:
"""
print('注销111')
def register(self):
"""
注册
:return:
"""
print('注册111')
def run(self):
"""
主代码
:return:
"""
print("""
请输入要执行的功能:
1. 登录
2. 注销
3. 注册
""")
choice = int(input('请输入要执行的序号:'))
func_name = Account.func_list[choice-1]
# func = getattr(Account,func_name) # Account.login
# func(self)
func = getattr(self, func_name) # self.login
func()
obj1 = Account()
obj1.run()
obj2 = Account()
obj2.run()
func_list = ['login', 'logout', 'register']
def login(self):
"""
登录
:return:
"""
print('登录111')
def logout(self):
"""
注销
:return:
"""
print('注销111')
def register(self):
"""
注册
:return:
"""
print('注册111')
def run(self):
"""
主代码
:return:
"""
print("""
请输入要执行的功能:
1. 登录
2. 注销
3. 注册
""")
choice = int(input('请输入要执行的序号:'))
func_name = Account.func_list[choice-1]
# func = getattr(Account,func_name) # Account.login
# func(self)
func = getattr(self, func_name) # self.login
func()
obj1 = Account()
obj1.run()
obj2 = Account()
obj2.run()
hasattr
根据字符串形式,去判断对象中是否有成员
setattr
根据字符串形式,动态地设置一个成员(内存)
delattr
根据字符串形式,动态删除一个成员(内存)
三大特性
封装
数据封装
class Foo(object):
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
obj = Foo(23,24)
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
obj = Foo(23,24)
方法封装
class Foo(object):
def func1(self):
pass
def func2(self):
pass
obj = Foo()
def func1(self):
pass
def func2(self):
pass
obj = Foo()
继承
单继承
class Foo(object):
def func1(self):
pass
class Base(Foo):
pass
obj = Base()
obj.func1()
def func1(self):
pass
class Base(Foo):
pass
obj = Base()
obj.func1()
多继承
class Foo(object):
def func1(self):
pass
class Base(object):
def func2(self):
pass
class Bar(Base,Foo):
pass
obj = Bar()
obj.func1()
obj.func2()
def func1(self):
pass
class Base(object):
def func2(self):
pass
class Bar(Base,Foo):
pass
obj = Bar()
obj.func1()
obj.func2()
super()
class Foo(object):
def func1(self):
super().func1
print('Foo func1')
class Base(object):
def func1(self):
print('Base func1')
class Bar(Base,Foo):
pass
obj = Bar()
obj.func1()
def func1(self):
super().func1
print('Foo func1')
class Base(object):
def func1(self):
print('Base func1')
class Bar(Base,Foo):
pass
obj = Bar()
obj.func1()
C3算法
经典类,一条道走到黑(深度优先)。
新式类,C3算法实现(python2.3更新时c3算法)。
Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W)
Foo, I,B,
获取第一个表头 和 其他表位进行比较
不存在则拿走。
如果存在,则放弃,然后获取第二个表的表头再次和其他表的表尾进行比较。
新式类,C3算法实现(python2.3更新时c3算法)。
Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W)
Foo, I,B,
获取第一个表头 和 其他表位进行比较
不存在则拿走。
如果存在,则放弃,然后获取第二个表的表头再次和其他表的表尾进行比较。
__mro__
查询执行顺序
issubclass
class Base(object):
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(issubclass(Bar,Base)) # 检查第一个参数是否是第二个参数的 子子孙孙类
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(issubclass(Bar,Base)) # 检查第一个参数是否是第二个参数的 子子孙孙类
type
class Foo(object):
pass
obj = Foo()
print(obj,type(obj)) # 获取当前对象是由那个类创建。
if type(obj) == Foo:
print('obj是Foo类型')
pass
obj = Foo()
print(obj,type(obj)) # 获取当前对象是由那个类创建。
if type(obj) == Foo:
print('obj是Foo类型')
isinstance
class Base(object):
pass
class Foo(Base):
pass
obj1 = Foo()
print(isinstance(obj1,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
print(isinstance(obj1,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
obj2 = Base()
print(isinstance(obj2,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
pass
class Foo(Base):
pass
obj1 = Foo()
print(isinstance(obj1,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
print(isinstance(obj1,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
obj2 = Base()
print(isinstance(obj2,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
多态
鸭子模型
修饰符
私有
class Foo(object):
def __init__(self,a1,a2):
self.__a1 = 23 # 私有实例变量
self.a2 = 63
def __func(self): # 私有实例方法
print(self.__a1,self.a2)
def func1(self):
self.__func()
obj = Foo(23,12)
obj.func1() # 派生类也不可以调用
def __init__(self,a1,a2):
self.__a1 = 23 # 私有实例变量
self.a2 = 63
def __func(self): # 私有实例方法
print(self.__a1,self.a2)
def func1(self):
self.__func()
obj = Foo(23,12)
obj.func1() # 派生类也不可以调用
博客园
0 条评论
下一页