Python object
面向对象:http://www.cnblogs.com/wupeiqi/p/4766801.html
class 类关键字
class index(继承):
def __init__(self,name,age):
self.name = name
self.age = age
python 支持多继承:
深度优先,广度优先
当类是经典类时,按照深度优先的方式查找
当类是新式类时,按照广度优先的方式查找(新式类,当前类或父类是继承object类)
|--普通字段->属于类(country = '中国')
|--字段|
| |--静态字段->属于对象(self.name = name)
|
| |-普通方法->至少一个self
------类对象|--方法 |-类方法 -->@classmethod
| |-静态方法->@staticmethod
|
|
|--属性|--普通属性->@property(定义时,在普通方法的基础上添加 @property 装饰器;
定义时,属性仅有一个self参数
调用时,无需括号foo_obj.prop)伪造成字段的方法叫属性
新式类,有三种属性访问方式:
obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
使用静态字段的方法:BAR = property(get_bar)
静态字段的方法,经典类和新式类没有区别
print(obj.BAR)#自动调用get_bar的方法,并获取返回值
BAR = property(get_bar, set_bar, del_bar, 'description...')
obj = Foo()
obj.BAR # 自动调用第一个参数中定义的方法:get_bar
obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
del Foo.BAR # 自动调用第三个参数中定义的方法:del_bar方法
obj.BAE.__doc__ # 自动获取第四个参数中设置的值:description...
!所以,定义属性共有两种方式,分别是【装饰器】和【静态字段】,而【装饰器】方式针对经典类和新式类又有所不同
私有方法&私有字段:
__init__:私有方法,self.__foo='私有字段'
普通字段-公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
-私有普通字段:仅类内部可以访问;
类的特殊成员:
1.__doc__:表示类的描述信息
2.__module__ :表示当前操作的对象在哪一个模块
__class__ : 表示当前操作的对象的类是什么
3.__init__:创建类的时候自动调用
4.__del__:虚构方法,当前对象在内存中被释放是,自动执行
5.__call__: 对象后面加括号,触发执行.
6.__dict__: cls.__dict__ : 获取类的静态字段和方法
obj.__dict__ : 获取obj的成员
7.__str__: 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值.
8.__getitem__、__setitem__、__delitem__用于索引操作,以上表示获取,设置,删除数据,obj['name'], obj['age']=18, del obj['city']
result = obj['k1'] # 自动触发执行 __getitem__
obj['k2'] = 'wupeiqi' # 自动触发执行 __setitem__
del obj['k1'] # 自动触发执行 __delitem__
9.__getslice__、__setslice__、__delslice__ :该三个方法用于分片操作
obj[-1:1] # 自动触发执行 __getslice__
obj[0:1] = [11,22,33,44] # 自动触发执行 __setslice__
del obj[0:2] # 自动触发执行 __delslice__
10.iter:obj = iter([11,22,33,44])
for i in obj:
print i
组合:
在一个类中以另外一个类的对象作为数据属性,称之为类的组合
class BirthDate: class Course: class Professor:
p1 = Professor('egon','male',
BirthDate('1995','1','27'),
Course('python',1800,'4 months'))
p1.birth.months == 1
其他相关:
isinstance(obj,Foo):检查obj是否是类Foo的对象
issubclass(sub,super):检查sub是否super的子类(派生类)
异常基本类型:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
interface:接口
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Wechatpay(Payment):
def fuqian(self,money):
print('微信支付了%s元'%money)
p = Wechatpay() #不调就报错了
子类必须重写父类的方法
classmethod 类方法,staticmethod 静态方法 (Foo.func() 不需要实例化)
相同:都可以直接被类调用,不需要实例化
不同:
类方法必须有一个cls参数表示这个类,可以使用类属性
静态方法不需要,静态方法不能直接使用
普通方法 默认有一个self对象传进来,并且只能被对象调用——绑定到对象
类方法 默认有一个cls传进来表示本类,并且可以被类和对象(不推荐)调用——绑定到类
静态方法 没有默认参数,并且可以被类和对象(不推荐)调用——非绑定

浙公网安备 33010602011771号