Class 类:
一个类即是对一类拥有相同属性的对象的抽象。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
class Role(object): #定义一个类
def __init__(self,name,money=15000): #初始化函数,在生成一个角色时要初始化的一些属性就填写在这里
self.name = name #__init__中的第一个参数self,
self.money = money
1、class是定义类的语法,Role是类名,(object)是新式类的写法
2、__init__()叫做初始化方法(或构造方法), 在类被调用时,这个方法会自动执行,进行一些初始化的动作。
3、 self代表实例化的对象,在类实例化的时候会自动传值。
例如r = Role('Jack'),在实例化的过程中,会将实例r的内存地址传给Role()。
Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同。
实例化:
把虚拟的抽象的类变成一个具体对象。
r = Role('Jack')
在执行r = Role(‘Jack’)时,python的解释器其实干了两件事:
1.在内存中开辟一块空间指向r这个变量名
2.调用Role这个类并执行其中的init(…)方法,相当于Role.init(‘r’,’Jack’),通过self.name = name,r和Jack这个值就关联起来,把值存入r的内存空间中。
在类中定义方法:
class Role(object):
def __init__(self,name):
self.name = name
def buy_gun(self,gun_name):
print(“%s has just bought %s” %(self.name,gun_name) )
调用类的方法:
r = Role('Jack')
r.buy_gun("AK47”)
r.buy_gun(“AK47”) ,执行时python 会自动帮你转成 Role.buy_gun(‘r’,’B21’)
面向对象的特性:
1、封装:
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
2、继承:
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。这样就可以使用原有类的所有功能,并在无需重新编写原有类的情况下对这些功能进行扩展。
继承的类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,其实就是从一般到特殊的过程。
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承的实现方式:实现继承、接口继承。
1、实现继承是指使用基类的属性和方法而无需额外编码的能力;
2、接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
OO开发范式大致为:
划分对象→抽象类→将类组织成为层次化结构(继承和合成)→用类与实例进行设计和实现
抽象类:
仅定义将由子类创建的一般属性和方法。
实例:Teacher类继承SchoolMember类
class SchoolMember(object):
def __init__(self, name, age):
self.name = name
self.age = age
class Teacher(SchoolMember): #继承SchoolMember
def __init__(self, name, age, course, salary):
super(Teacher, self).__init__(name, age)
self.course = course
self.salary = salary
3、多态
多态性(polymorphisn)是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说就是一个接口,多种实现。
那么,多态的作用是什么呢?封装可以隐藏实现细节,使得代码模块化,继承可以扩展已存在的代码模块(类),它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
Pyhon 很多语法都是支持多态的,比如 len(),sorted(), 你给len传字符串就返回字符串的长度,传列表就返回列表长度。
Python多态示例
# _*_coding:utf-8_*_
class Animal(object):
def __init__(self, name): # Constructor of the class
self.name = name
def talk(self): # Abstract method, defined by convention only
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def talk(self):
print('%s: 喵喵喵!' % self.name)
class Dog(Animal):
def talk(self):
print('%s: 汪!汪!汪!' % self.name)
def func(obj): # 一个接口,多种形态
obj.talk()
c1 = Cat('小晴')
d1 = Dog('李磊')
func(c1)
func(d1)
示例中:
1、Animal类是一个父类,为子类提供共有的类属性。同时,定义一个抽象方法,形成接口。
2、Cat和Dog两个子类,在继承Animal类的同时实现Animal类中的抽象方法。
3、在主程序中定义一个函数,def func(obj)去调用抽象方法,即接口。
新式类和经典类:
1)写法不同,新式类需要显式继承object类
经典类
class A:
pass
新式类
class B(object):
pass
Python 2.x中默认都是经典类,只有显式继承了object才是新式类
Python 3.x中默认都是新式类,不必显式的继承object
2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索。即经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动
其他:
新式类对象可以直接通过__class__属性获取自身类型:type
新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中
新式类增加了__getattribute__方法
新式类更符合OOP编程思想,统一了python中的类型机制。