1.面向对象介绍
面向过程:根据业务逻辑从上到下写代码.
面向对象:将函数与数据绑定在一起,进行封装.
Python面向对象三要素:封装,继承,多态.
2.类和对象
2.1类
类(Class)由三部分构成:名称,属性,方法
类的抽象:拥有相同或者类似属性和行为的对象都可以抽象出一个类.
定义一个类示例:
#类名
class Cat:
#初始化方法
def __init__(self,new_name,new_age):
self.name=new_name
self.age=new_age
def __str__(self):
#相当于Java中的toString()方法
return 描述信息
#方法
def eat(self):
print('猫吃鱼...')
def desc(self):
print('%s年龄是%s'%(self.name,self.age))
#创建对象
tom = Cat('咖啡',12)
tom.eat()
#为tom指定的对象添加属性
#tom.name='咖啡'
#tom.age=11
self:相当于Java中的this,指代当前对象自身.
类中的方法,必须至少有一个参数,参数名可以自定义,不一定非要self,推荐使用self,形成代码规范.
__init__方法
在创建对象后会调用__init__方法,负责初始化,会把创建的对象的引用传入__init__方法中,然后再将对象的引用返回
__str__方法
类似Java的toString()方法
return 对象描述信息
__del__方法
对象的引用计数为0时,Python垃圾回收机制会销毁该对象,然后会自动调用类的__del__方法.
销毁对象引用:del 对象引用
import sys
sys.getrefcount(x):查看x指向的对象的引用计数,所得值比实际的引用计数多1.
__new__方法
创建对象时会被自动调用,该方法是用来创建对象
class Cat(object):
def __new__(cls):#cls此时是Cat所指向的类对象
return object.__new__(cls)#调用父类的__new()__方法创建对象
cat = Cat()
#相当于做了三件事:
#1,调用__new__方法来创建对象,然后用一个变量来接收__new__方法的返回值,这个返回值表示创建出来的对象的引用
#2,__init__(刚刚创建出来的对象的引用);
#3,返回对象的引用
在Python中__new__方法+__init__方法相当于Java中的构造方法,前者负责创建对象,后者负责初始化对象
隐藏对象的属性:定义方法对类的属性进行设置和获取,更加安全和符合面向对象的封装思想.
私有方法:方法名前加两个下划线'__',适合类内部封装,一般私有的方法比较重要,不适合被外部调用.
私有属性:属性名前加两个下划线"__".
def __look(self):#私有方法
self.__name='Anna'#私有属性
pass
3.全局变量,函数和属性和方法的联系和区别
相似点在于共享变量
不同点在于,类中的属性和方法是封装的,具有一点的私有性.
4.继承
类共同属性或方法的抽取.
父类,基类------子类,派生类
在Python中,可以多继承,不同父类用逗号','分隔.也可以多层继承
class 子类名(父类A,父类B):
pass
多继承注意事项:
类名.__mro__:返回一个元组,该元组决定调用一个方法时的优先顺序.
推荐在不同类中,定义方法时,采用不同的方法名.
在Python3中,父类中有object为新式类,没有的为经典类,推荐新建类时加上object
class Base(object):
pass
私有方法和属性不会被子类继承.
class 子类名(父类名):
def 子类自己的方法(self):
pass
4.1方法重写:
在子类中定义与父类方法名相同的方法,在方法中也可以调用父类的方法:父类名.方法名(self)
子类如果调用的是继承自父类的公有方法,则可以在此公有方法中调用父类的私有方法和私有属性;
子类不能在重写的父类方法中调用父类的私有方法和私有属性.
5.多态
子类在执行相同的方法时所表现出的不同状态.
因为Python是动态类型语言,故Python的多态没有Java的多态体现的那么明显.
6.类属性与实例属性
class 类名():
age=0 #类属性
def 方法名(self):
self.name='Anna' #实例属性
pass
类也是对象,被称为类对象;由类生成的实例称为实例对象.类对象只有一个,而实例对象可以有多个.
类对象的属性称为类属性;实例对象的属性称为实例属性.
实例属性和具体的某个实例对象有关系,并且一个实例对象和另外一个实例对象是不共享实例属性的.
类属性属于类对象,并且在实例对象之间共享.
通过类名.类属性名获取类属性的引用.
7.类方法,实例方法,静态方法
class Game(object):
num=0#类属性
@classmethod
def add_num(cls):#类方法--cls只是命名规范
cls.num = 100
pass
def __init__(self):#实例方法
Game.add_num()#调用类方法:类名.类方法名或者实例对象.类方法名
pass
@staticmethod
def print_info():#静态方法
pass
类方法:需要使用@classmethod进行装饰,必须有个参数,可以通过类名.类方法名或者类的实例对象.类方法名进行调用.
实例方法:类中没有使用@classmethod以及@staticmethod进行装饰的方法,必须有个参数.
静态方法:使用@staticmethod进行装饰的方法,对参数个数没有要求.可以通过类对象或实例对象调用静态方法