类变量与实例变量构造函数
__author__ = 'meng' class Foo: #n = 12345 #类变量 def __init__(self, name, age): # 构造函数 # 在实例化时做一些类的初始化工作 self.name = name #实例变量(静态属性),作用域就是实例本身 self.age = age def shot(self): #类的方法功能(动态属性) print ('%s.......' %(self.name)) obj = Foo('nick', 18) #实例化类 Foo, print (obj.name) #调用 print (obj.age) print (obj.shot()) obj2 = Foo('jenny', 21) print (obj2.name) print (obj2.age)
私有方法
一个python函数或类方法以两个下划线开始(不是结束),他是私有的,私有方法不能在类以外调用,只能在类内部调用。
__author__ = 'meng' class Person: def __init__(self,name): self.name = name print (self.name) def __work(self,salary): print ("%s salary is: %d"%(self.name,salary)) def worker(self): self.__work(500) #在类内部调用私有方法 if __name__=="__main__": officer = Person("Jack") #officer.__work(1000) #会报错 officer.worker()
继承
python3中的类都是新式类。
继承的好处一:减少冗余代码
在子类定义新的属性,覆盖掉父类的属性,称为派生。
class Animal: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def eat(self): print('eating') def talk(self): print('%s 正在叫' %self.name) class People(Animal): def __init__(self, name, age, sex,education): Animal.__init__(self,name,age,sex) self.education=education def talk(self): Animal.talk(self) print('%s say hello' %self.name) class Pig(Animal): pass class Dog(Animal): pass peo1=People('alex',18,'male','小学肄业') #People.__init__ pig1=Pig('wupeiqi',20,'female') dog1=Dog('yuanhao',30,'male') print(peo1.education) peo1.talk() pig1.talk() dog1.talk() 输出结果: 小学肄业 alex 正在叫 alex say hello wupeiqi 正在叫 yuanhao 正在叫
经典类:深度优先,F->D->B->A->E->C->H
新式类:广度优先,F->D->B->E->C->H->A
经典类深度优先:
class A: def test(self): print('from A') class B(A): # def test(self): # print('from B') pass class C(A): # def test(self): # print('from C') pass class D(B): # def test(self): # print('from D') pass class E(C): # def test(self): # print('from E') pass class F(D,E): # def test(self): # print('from F') pass f=F() f.test() 输出结果: from A
新式类广度优先:
class A: def test(self): print('from A') pass class B(A): # def test(self): # print('from B') pass class C(A): # def test(self): # print('from C') pass class D(B): # def test(self): # print('from D') pass class E(C): # def test(self): # print('from E') pass class H(A): # def test(self): # print('from H') pass class F(D,E,H): # def test(self): # print('from F') pass f=F() f.test()
子类调用父类的方法
第一种方法不推荐,父类名字改变,子类也要跟着改。
推荐第二种super(),python3中直接可以super().test()调用父类Foo1的test方法,python2中需要super(Bar,self).test()调用。
多态与多态性
多态:同一种事物的多种形态。
class Animal:
def talk(self):
print('正在叫')
class People(Animal): #动物的形态之一人
def talk(self):
print('say hello')
class Pig(Animal): #动物的形态之一猪
def talk(self):
print('哼哼哼')
class Dog(Animal): #动物的形态之一狗
pass
多态性:
class Animal: def talk(self): print('正在叫') class People(Animal): def talk(self): print('say hello') class Pig(Animal): def talk(self): print('哼哼哼') class Dog(Animal): def talk(self): print('汪汪汪') class Cat(Animal): def talk(self): print('喵喵喵') peo1=People() pig1=Pig() dog1=Dog() cat1=Cat() #多态性 # peo1.talk() # dog1.talk() # pig1.talk() def func(x): x.talk() func(peo1) func(pig1) func(dog1) func(cat1) 输出结果: say hello 哼哼哼 汪汪汪 喵喵喵