面向对象
面向对象: class
函数编程
def email():
print('发送邮件')
def msg():
print('发送短信')
def weichat():
print('发送微信')
if 1==1:
email()
msg()
weichat()
面向对象编程
class Message:
def email(self):
print('发送邮件')
def msg(self):
print('发送短信')
def weichat(self):
print('发送微信')
if 1 == 1:
obj = Message()
obj.weichat()
obj.msg()
obj.email()
函数:定义简单/调用简单
面向对象:缺点定义复杂/调用复杂 优点 归类 将某些类似的函数写在一起
总结:
函数的编程可能会比面向对象好
python中支持两种编程方式
面向对象的三大特征
封装 继承 多态
封装:
数据封装和方法封装
相关功能封装到一个类中
将数据封装到一个对象
继承
提高代码的重用性
先在自己类(派生类)中,没有时去父类(基类)中找
python支持多继承
多继承 先找左边
self到底是谁,self是哪个类的对象,那么就从该类开始找
super主动调用其他类的成员
类名.方法名(自己穿self) 与继承无关
super()
多态
多种形态或多种状态
鸭子模型,只要可以嘎嘎叫的就是鸭子
由于python原生态支持多态,所以没有特殊性。但是在Java中必须为要求的形态或形态子类
面向对象的成员
分三类 变量(字段) 方法 属性
变量
实例变量
静态变量
class Province:
# 静态字段
country = '中国'
def __init__(self, name):
# 普通字段
self.name = name
# 直接访问普通字段
obj = Province('河北省')
print obj.name
# 直接访问静态字段
Province.country
字段的定义和使用
准则:
实例变量(字段)访问时,使用对象访问。即:obj.name
类变量(静态字段)访问时,使用方法访问,即Foo.country(是在不方便时,才用对象)
方法: 实例方法 静态方法 类方法
实例方法: def func(self):
静态方法:@staticmethod
如果方法无需使用对象中封装的值,那么就可以使用静态方法
类方法:@classmethod
如果会使用当前类那么就使用类方法
class Foo:
def __init__(self, name):
self.name = name
def ord_func(self):
""" 定义普通方法,至少有一个self参数 """
# print self.name
print '普通方法'
@classmethod
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """
print '类方法'
@staticmethod
def static_func():
""" 定义静态方法 ,无默认参数"""
print '静态方法'
# 调用普通方法
f = Foo()
f.ord_func()
# 调用类方法
Foo.class_func()
# 调用静态方法
Foo.static_func()
方法的定义和使用
属性:通过方法改造出来
编写:方法上方写@property 方法参数:只有一个self
调用:无需加括号 对象.方法
应用场景:对于简单的方法,当无需传参且有返回值时可以使用@property
# ############### 定义 ###############
class Foo:
def func(self):
pass
# 定义属性
@property
def prop(self):
pass
# ############### 调用 ###############
foo_obj = Foo()
foo_obj.func()
foo_obj.prop #调用属性
属性的定义和使用
修饰符
私有
成员的修饰符为两个下划线
继承中 私有变量在父类(基类)中,子类无法了解获取
公有
默认公有
嵌套(组合)
数据的各种嵌套
特殊方法
class Foo(object):
def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2
def __call__(self, *args, **kwargs):
print(11111,args,kwargs)
return 123
def __getitem__(self, item):
print(item)
return 8
def __setitem__(self, key, value):
print(key,value,111111111)
def __delitem__(self, key):
print(key)
def __add__(self, other):
return self.a1 + other.a2
def __enter__(self):
print('1111')
return 999
def __exit__(self, exc_type, exc_val, exc_tb):
print('22222')
# 1. 类名() 自动执行 __init__
# obj = Foo(1,2)
# 2. 对象() 自动执行 __call__
# ret = obj(6,4,2,k1=456)
# 3. 对象['xx'] 自动执行 __getitem__
# ret = obj['yu']
# print(ret)
# 4. 对象['xx'] = 11 自动执行 __setitem__
# obj['k1'] = 123
# 5. del 对象[xx] 自动执行 __delitem__
# del obj['uuu']
# 6. 对象+对象 自动执行 __add__
# obj1 = Foo(1,2)
# obj2 = Foo(88,99)
# ret = obj2 + obj1
# print(ret)
# 7. with 对象 自动执行 __enter__ / __exit__
# obj = Foo(1,2)
# with obj as f:
# print(f)
# print('内部代码')
# 8. 真正的构造方法
# 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)
内置函数
issubclass()
检查第一个参数是第二个参数的子类
class Base(object):
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类型')
"""
# #### 练习题
"""
class Foo(object):
pass
class Bar(object):
pass
def func(*args):
foo_counter =0
bar_counter =0
for item in args:
if type(item) == Foo:
foo_counter += 1
elif type(item) == Bar:
bar_counter += 1
return foo_counter,bar_counter
# result = func(Foo(),Bar(),Foo())
# print(result)
v1,v2 = func(Foo(),Bar(),Foo())
print(v1,v2)
"""
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)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
# #################### 练习
"""
给你一个参数,判断对象是不是由某一个指定类? type --> type(obj) == Foo
给你一个参数,判断对象是不是由某一个指定类或其父类? isinstance --> instance(obj,Foo)
"""

浙公网安备 33010602011771号