乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
面向对象的特性

一、继承

(一)继承的概念

  生活中的继承,一般指的是子女继承父辈的财产。

  Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法,具体如下

class A(object):
    def __init__(self):
        self.num = 1

    def demo(self):
        print(self.num)


class B(A):
    pass


result = B()
result.demo()

------------------
1

  在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。

(二)单继承

  故事:很久以前,枯荣大师有一个弟子叫张三,他马上要与世长辞,现在他想他自己的功夫传授给自己唯一的关门弟子。

class Master(object):
    def __init__(self):
        self.kunfu = "一阳指,狮吼功,六脉神剑"

    def demo(self):
        print("枯荣大师的功夫:",self.kunfu)

class Apprentice(Master):
    pass

func = Apprentice()
print(func.kunfu)
func.demo()


-------------------------
一阳指,狮吼功,六脉神剑
枯荣大师的功夫: 一阳指,狮吼功,六脉神剑

 

(三)多继承

  故事:接上,张三不满足枯荣大师的功夫,现在他又拜在了张三丰的门下,想学太极

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"

    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)

func = Apprentice()
print(func.kunfu_kurong)
print(func.kunfu_sanfeng)

-------------------------------
六脉神剑
太极
  • 所谓多继承意思就是一个类同时继承了多个父类。

(四)子类重写父类方法和属性

  故事:接上,张三觉得师傅的功夫都有一定的不足,决定改善师傅的功夫。

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"

    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)
        self.kunfu_kurong = "万剑归宗"
        self.kunfu_sanfeng = "醉拳"

    def demo_zhangsa(self):
        print(f"张三独创的功夫---{self.kunfu_kurong}------{self.kunfu_sanfeng}")

func = Apprentice()
# print(func.kunfu_kurong)
# print(func.kunfu_sanfeng)
func.demo_zhangsa()

---------------------------------------
张三独创的功夫---万剑归宗------醉拳

(五)子类调用父类的方法和属性

  故事:接上,张三在两位师傅功夫的基础上创建了新的功夫,但是他想在使用自己功夫的时候也可以用到师傅的功夫。

  方法一:子类调用父类的方法和属性

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"

    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)
        self.kunfu_kurong = "万剑归宗"
        self.kunfu_sanfeng = "醉拳"

    def demo_zhangsa(self):
        print(f"张三独创的功夫---{self.kunfu_kurong}------{self.kunfu_sanfeng}")

    def demo_zhangsan_kurong(self):
        Kurong_Master.__init__(self)
        Kurong_Master.demo_kurong(self)

    def demo_zhangsan_sanfeng(self):
        Sanfeng_Master.__init__(self)
        Sanfeng_Master.demo_sanfeng(self)

func = Apprentice()

func.demo_zhangsa()
func.demo_zhangsan_kurong()
func.demo_zhangsan_sanfeng()

----------------------------------------
张三独创的功夫---万剑归宗------醉拳
枯荣大师的功夫: 六脉神剑
张三丰的功夫: 太极

  方法二:同名的情况下,只能使用子类里面的方法

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"

    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)
        self.kunfu_kurong = "万剑归宗"
        self.kunfu_sanfeng = "醉拳"

    def demo_zhangsa(self):
        print(f"张三独创的功夫---{self.kunfu_kurong}------{self.kunfu_sanfeng}")

func = Apprentice()
# print(func.kunfu_kurong)
# print(func.kunfu_sanfeng)
func.demo_zhangsa()
demo = Kurong_Master()
demo.demo_kurong()
demo2 = Sanfeng_Master()
demo2.demo_sanfeng()

--------------------------
张三独创的功夫---万剑归宗------醉拳
枯荣大师的功夫: 六脉神剑
张三丰的功夫: 太极

(六)多层继承

  故事:接上,多年之后,张三老了,想把自己的毕生所学,传给李四

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"

    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)
        self.kunfu_kurong = "万剑归宗"
        self.kunfu_sanfeng = "醉拳"

    def demo_zhangsa(self):
        print(f"张三独创的功夫---{self.kunfu_kurong}------{self.kunfu_sanfeng}")

    def demo_zhangsan_kurong(self):
        Kurong_Master.__init__(self)
        Kurong_Master.demo_kurong(self)

    def demo_zhangsan_sanfeng(self):
        Sanfeng_Master.__init__(self)
        Sanfeng_Master.demo_sanfeng(self)

class Disciple(Apprentice):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)
    def demo_Disciple_zhangsan(self):
        Apprentice.__init__(self)
        Apprentice.demo_zhangsa(self)

    def demo_Disciple_kurong(self):
        Kurong_Master.__init__(self)
        Kurong_Master.demo_kurong(self)

    def demo_Disciple_sanfeng(self):
        Sanfeng_Master.__init__(self)
        Sanfeng_Master.demo_sanfeng(self)



func = Disciple()
func.demo_Disciple_kurong()
func.demo_Disciple_sanfeng()
func.demo_Disciple_zhangsan()

------------------------------------
枯荣大师的功夫: 六脉神剑
张三丰的功夫: 太极
张三独创的功夫---万剑归宗------醉拳

(七)super()

  调用父类方法

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"

    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        # Kurong_Master.__init__(self)
        # Sanfeng_Master.__init__(self)
        # self.kunfu_kurong = "万剑归宗"
        # self.kunfu_sanfeng = "醉拳"
        super().__init__()
        super().demo_kurong()
        
func = Apprentice()
func.demo_kurong()

-----------------------
枯荣大师的功夫: 六脉神剑
枯荣大师的功夫: 六脉神剑

二、私有权限

(一)定义私有属性和方法

  在Python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。

  故事:续集:枯荣大师还有一招狮吼功,不想传授给他的徒弟,这个时候,可以把狮吼功这个属性设置为私有。

  设置私有权限的方法:在属性名和方法名前面加上两个下划线__.

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"
        self.__kurong = "狮吼功"

    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)
    def __demo_kurong(self):
        print("枯荣大师的功夫:",self.__kurong)

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)
        self.kunfu_kurong = "万剑归宗"
        self.kunfu_sanfeng = "醉拳"

    def demo_zhangsa(self):
        print(f"张三独创的功夫---{self.kunfu_kurong}------{self.kunfu_sanfeng}")

    def demo_zhangsan_kurong(self):
        Kurong_Master.__init__(self)
        Kurong_Master.demo_kurong(self)

    def demo_zhangsan_sanfeng(self):
        Sanfeng_Master.__init__(self)
        Sanfeng_Master.demo_sanfeng(self)



func = Apprentice()

func.__demo_kurong()   # 报错

  私有属性和私有方法只能在类里面访问和修改  

(二)获取和修改私有属性值

  在Python中,一般定义函数名get_xx用来获取私有属性,定义set_xx,用来修改私有属性值。

class Kurong_Master(object):
    def __init__(self):
        self.kunfu_kurong = "六脉神剑"
        self.__kurong = "狮吼功"


    def demo_kurong(self):
        print("枯荣大师的功夫:",self.kunfu_kurong)
    def get_demo(self):
        return self.__kurong
    def set_demo(self):
        self.__kurong = "一阳指"

class Sanfeng_Master(object):
    def __init__(self):
        self.kunfu_sanfeng = "太极"

    def demo_sanfeng(self):
        print("张三丰的功夫:",self.kunfu_sanfeng)


class Apprentice(Kurong_Master,Sanfeng_Master):
    def __init__(self):
        Kurong_Master.__init__(self)
        Sanfeng_Master.__init__(self)
        self.kunfu_kurong = "万剑归宗"
        self.kunfu_sanfeng = "醉拳"

    def demo_zhangsa(self):
        print(f"张三独创的功夫---{self.kunfu_kurong}------{self.kunfu_sanfeng}")





func = Kurong_Master()
print(func.get_demo())
func.set_demo()
print(func.get_demo())

------------------------------
狮吼功
一阳指

三、面向对象的三大特征

  • 封装

    将属性和方法书写到类的里面的操作即为封装

    封装可以为属性和方法添加私有权限

  • 继承

    子类默认继承父类的所有属性和方法

    子类可以重写父类属性和方法

  • 多态

    传入不同的对象,产生不同的结果

  多态

  多态指的是一类事物有多种形态

  定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果。

  • 好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!
  • 实现步骤

    定义父类,并提供公共方法

    定义子类,并重写父类方法

    传递子类对象给调用者,可以看到不同子类执行效果不同

class Son1():
    def demo(self):
        print("正面强攻")

class Son2():
    def demo(self):
        print("背后偷袭")

class Main(object):
    def func_demo(self,result):
        result.demo()

func1 = Son1()
func2 = Son2()
func3 = Main()
func3.func_demo(func1)
func3.func_demo(func2)

------------------------
正面强攻
背后偷袭

四、类属性和实例属性

  类属性就是 类对象所拥有的属性,它被该类的所有实例对象所共有。

  类属性可以使用类对象或实例对象访问

class Demo(object):
    num = 10

func = Demo()
print(Demo.num)
print(func.num)

-------------------
10
10

  修改类属性

  类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。

class A():
    name = 1
    age = 2

A.name = 3
A.age = 20

print(A.name)
print(A.age)

--------------
3
20

五、类方法和静态方法

  需要用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。

class Demo(object):
    __num = 10

    @classmethod
    def get_num(cls):
        return cls.__num

func = Demo()
print(func.get_num())

-------------------
10

  静态方法

  当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性、类方法、创建实例等)时,定义静态方法。

  取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗。

class Demo(object):

    @classmethod
    def get_info(cls):
        print("我是一个静态方法")

func = Demo()
func.get_info()

-------------------------
我是一个静态方法

posted on 2022-10-05 22:31  乐之之  阅读(23)  评论(0编辑  收藏  举报