Python基础-面对对象

类的定义:
 
class class_name:
    # 相应的逻辑代码

 

经典类:class class_name:
新式类:class class_name(object):
类的实例化:
obj = class_name()

 

注:python类的实例化不像java等语言需要new关键字,而是直接将类赋给变量名
类的实例化本质:类在实例化的时候会为该对象开辟一个内存空间,在该内存空间中存有成员变量,但是该空间中没有为类的方法开辟空间,所以在类的对象调用方法的时候为了区别是哪个对象在调用该方法,就要传一个self给类的成员方法,所以,类的成员方法中都有一个self参数,该参数是有类实例化的时候有系统自动将对象变量地址传入__init__构造函数中
例如:
d = Dog() 等价于 d = Dog(d)
类变量和实例变量:类变量是在类的方法之外定义的变量,它存在于系统为类分配的内存空间中,它可以直接通过类名直接调用,也可以通过实例变量名调用;实例变量是在构造函数中通过self关键字声明的变量,它存在于系统为类的实例分配的内存空间中,它只能由实例变量调用,即实例变量的作用域就是实例本身。
变量调用顺序:系统在调用实例的变量时,先在实例变量中寻找是否存在该变量,如果存在就直接调用该实例变量,否者就在类变量中查找,如果存在就调用该类变量,所以如果实例变量和类变量中存在相同变量名变量,就优先调用实例变量。
类和实例内存分配机制:系统将类和实例内存分开储存,像类变量、类方法等储存在系统为类分配的内存空间,而像实例变量等就储存在系统为实例分配的内存空间。所以当实例在调用类方法的时候实质是访问的类的内存空间
在实例中修改类变量:
  • 简单数据类型(数字、字符串)
实例修改一个类变量实质是在该实例的内存空间中开辟一块空间存储该变量(在之前实例的内存中是不存在该类变量的内存的,它只存在于类的内存中,通过实例修改该类变量后二者同时存在该变量),根据优先调用实例变量的原则。所以在该实例调用该变量时结果就是修改后的值,但是其他该类的实例中的这个类变量该是以前的值是不会随着其他变量的修改而改变的
  • 复杂的数据类型(列表、字典)
和简单数据类型相反,对于复杂的数据类型,如果一个实例对变量的值进行了修改,那么其余该类的实例的该变量也会跟着变化
类变量的作用:1、公用属性 2、节省内存
构造函数:__init__(self)
析构函数:__del__(self)
私有属性和私有方法:在变量名前加两个下划线 例如:self.__name = name;def __func(self)
继承:如果类B要继承A 则class B(A): pass
子类方法调用父类方法:直接使用父类名调用该方法,并将self传给该方法
python 2.x
新式类多继承顺序:如果一个类继承自多个类,那么它的顺序是自左向右
注:在子类中已经有的,在父类中可以不用声明就可以直接调用,类在实例化的时候先去执行子类的构造函数,如果子类没有再自左向右执行父类的构造函数,却只执行第一个父类的构造函数,执行后就不会再执行其他父类的构造函数。总结:不管是子类还是父类或者是父类的父类,构造函数只执行一次,执行以后就不会执行其他构造函数->广度优先
经典类多继承顺序:深度优先
python 3.x 的新式类和经典类都是按照广度优先顺序继承的
新式类中子类调用父类方法:super(child,self).__init(elem1,elem2...)
多态:一种接口,多种形态;python没有特定的语法支持多态,但是可以实现多态
静态方法:静态方法之前要声明@staticmethod,静态方法形参中不需要self ->静态方法实质上是一个装饰器
静态方法只是名义上归类管理,实际上在静态方法里访问不了类或实例中的中的任何属性和类方法
类方法:类方法之前要声明@classmethod,它只能访问类变量,不能访问实例变量
属性方法:属性方法之前要声明@property,把一个方法变成一个静态属性,它不能有参数,但是可以为他赋值,赋值的方法是为他添加一个装饰器(@func.setter),如果要在删除的时候执行一定功能也要使用一个装饰器(@func.deleter)例如
class class_name:
@property
def func(self):
    pass
@func.setter
def func(self,val)
    pass
 
class_name.func#调用
class_name.func = value#赋值,相当于将value作为参数传入func()函数,解释器先调用func.setter下的方法,再调用func方法本身

 

类的特殊成员方法:
  • __doc__:打印类的描述信息(自动生成,使用的时候可不加括号)
  • __module__:表示当前操作的对象在那个模块(类自动生成)
  • __class__:表示当前操作的对象的类是什么(类自动生成)
  • __dict__:查看类或对象中所有成员(类自动生成)
  • __call__(self,*args,**kwargs):对象后面加括号,触发执行
  • __str__(self):如果一个类中定义了该方法,那么在打印对象时,默认输出该方法的返回值(类似于java中的toString方法)
  • __getitem__(self,value)、__setitem__(self,key,value)、__delitem__(self,value):将对象当做一个字典来使用,它们对应的功能是获取、设置、删除字典元素
  • __new__(cls,*args,*kwargs):用来创建实例,在它的内部调用__init__()
  • __metaclass__:元类,一篇关于元类很好的文章http://blog.jobbole.com/21351/
首先写下class Foo(object),但是类对象Foo还没有在内存中创建。Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类
类的起源:所有类都是起源于Type
创建类有两种方法一种是普通创建方式,另外一种是特殊方法:
 
def func(self):
    pass
Foo = type('Foo',(object,),{'func',func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员

 

 
 
 
 
 
 
 
posted @ 2017-07-25 13:03  BetterManPeter  阅读(181)  评论(0编辑  收藏  举报