python3面向对象(1)
1.定义类,实例化对象:
class Nanny(object): #class 定义一个类名Nanny,这个类继承了object def __init__(self,name,age): #__init__初始化方法,在创建对象的时候自动调用,第一个参数是必须有的self指的是创建的对象, self.name = name self.age = age def cook(self): #在类中的普通函数叫做方法;都有一个self参数;可以被创建的对象调用 print("这是一个做饭的过程") obj1 = Nanny("小红",22) #创建一个obj1对象,传入参数;这个参数被传入__init__初始化方法中 print(obj1.name) print(obj1.age) obj1.cook() #调用类中的方法
2类中的方法(普通方法(实例化方法),类方法,静态方法)和 类属性
class Nanny(object): Nanny_name = "this is Nanny name" #这是一个类属性,可以通过类型.调用 def __init__(self,name,age): self.name = name self.age = age @classmethod #这是一个类方法;通过@classmethod def cook1(cls): #方法的参数是cls 代表的这个类 print("我是一个类方法") @staticmethod #这是一个静态方法,通过@staticmethod def cook2(): #方法里面可以没有参数 print("我是一个静态方法:这是我的使用说明") def cook(self): print("这是一个做饭的过程") obj1 = Nanny("小红",22) print(obj1.name) print(obj1.age)
#方法的调用,实例化的对象可以调用类中的所有方法 obj1.cook() obj1.cook1() obj1.cook2() #但是类名只能调用静态方法和类方法 Nanny.cook1() Nanny.cook2()
3继承
何为继承,继承既新建的类具有被继承类的属性和方法;继承的目的是为了减少不必要的代码,实现代码的重复利用。那如何实现继承呢看代码:
class Parsenclass1(object): #定义一个类让这个类继承object(python3中默认继承object;python2中需要指定) Parsen_var = "this is parsen var" def __init__(self): print("111") def f1(self): print("这是Parsenclass1的f1") def f2(self): print("这是Parsenclass1的f2")
def f3(self):
print("这是Parsenclass1的f3")
def f4(self):
print("这是Parsenclass1的f4")
class son1(Parsenclass1): #定义一个son1类,让这个类继承 Parsenclass1;那么这个类型具有父类中的所有属性和方法(除去私有的,暂时不表,后面介绍)
son1_var = "son1关键字"
def __init__(self):
print("这是son1")
def f1(self):
print("这是son2的f1")
def f2(self):
print("这是son1的f2")
self.f1()
class son2(Parsenclass1): #定义一个son2,和son1的父类一样
son2_var = "这是son2关键字"
def __init__(self):
print("这是son2")
def f1(self):
print("这是son2的f1")
def f2(self):
print("这是son2的f2")
def f3(self):
print("这是son2的f3")
class son_son(son1,son2): #定义一个son_son类,继承son1和son2;这是个多继承 son_son_var = "这是son_son的关键字" def __init__(self): print("这是son_son") def f1(self): print("这是son_son的f1") obj1 = son_son() #创建对象 obj1.f2() # 调用f2()函数
obj1.f3()
obj1.f4()
print(son_son.__bases__)
执行结果如下:
这是son_son #__init__函数默认执行 这是son1的f2 #当执行f2方法时,现在创造该对象的类中寻找,如果找到了就执行,如果没有找到则会向父类中寻找;这个父类时son1和son2,先在son1中寻找;找到了执行f2();当执行f2()函数的时候遇到了
self.f1()函数,那这个f1函数指向的又是谁呢;创建类的时候self代表的是实例化对象(obj1),所以先去创建这个对象的类(son_son)中寻找f1函数; 这是son_son的f1
这是son2的f3 #当调用f3的时候,son1中没有f3函数;那么这个时候是继续沿着son1的父类中寻找还是去son2中寻找呢;看结果这个是先到son2中寻找f3函数(新式类中寻找父类的方法是从左到右,广度优先)
这是Parsenclass1的f4 #调用f4的时候先去son_son类中找,没有找到再去son1和son2中依次寻找,也没有找到最后去了Parsenclass1中寻找 (<class '__main__.son1'>, <class '__main__.son2'>) #类.__bases__ 显示该类的父类