7 面相对象编程 类的继承 经典类新式

类变量与实例变量构造函数

__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
View Code

新式类广度优先:

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()
View Code

子类调用父类的方法

第一种方法不推荐,父类名字改变,子类也要跟着改。

推荐第二种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
哼哼哼
汪汪汪
喵喵喵

  

 

 

原文地址:https://www.cnblogs.com/menglingqian/p/6678616.html