首页 > 其他分享 >面向对象的特性

面向对象的特性

时间:2022-10-05 22:44:37浏览次数:38  
标签:__ kunfu demo self 特性 面向对象 Master def

一、继承

(一)继承的概念

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

  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(Father):
    def demo(self):
        print("正面强攻")

class Son2(Father):
    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()

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

标签:__,kunfu,demo,self,特性,面向对象,Master,def
From: https://www.cnblogs.com/LoLong/p/16756636.html

相关文章

  • 【Java8新特性】- Lambda表达式
    Java8新特性-Lambda表达式......
  • 面向对象-高级篇
    类变量:什么是类变量?一个可以被一个类所有对象共享的变量类变量关键字?static类变量语法?访问修饰符static数据类型变量名;[推荐使用]         ......
  • postgresql各版本不向后兼容重大特性
    pg13不兼容的重大改变wal_keep_segments(最初PR的名字是standby_keep_segments)->wal_keep_sizepg12不兼容的重大改变不在具有recovery.conf文件,它本来是standbyprom......
  • [金三银四面试季]Java面向对象高频面试题
      金三银四正是跳槽涨薪的好时节,波哥给大家整理了很多面试高频的问题,助力大家找到更好的工作哦,点点关注,感谢支持。面向对象面试题1.谈谈你对面向对象思想的理解?面向过程......
  • 2022.10.5java特性和优势
    Java构建工具:Ant,Maven,Jekins应用服务器:Tomcat,Jettty,Jboss,Websphere,weblogicWeb开发:Struts,Spring,Hibernate,myBatis开发工具:Eclipse,Netbean,intellij......
  • 15-RabbitMQ高级特性-消费端限流
    消费端限流什么是消费端限流假设一个场景,首先,我们RabbitMQ服务器有上万条消息未处理的消息,我们随机打开一个消费者客户端,会出现下面情况巨量的消息瞬间全......
  • 16-RabbitMQ高级特性-消费端的消息ACK与重回队列
    消费端的消息ACK与重回队列消费端的手工ACK和NACKACK分为自动和手动消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿如果由于服务器宕......
  • 17-RabbitMQ高级特性-TTL队列/消息
    TTL队列/消息TTL:TimeToLive,生存时间RabbitMQ支持消息的过期时间,在消息发送时可以指定RabbitMQ支持队列的过期时间,从消息进入队列开始计算,只要超过了队列......
  • 18-RabbitMQ高级特性-死信队列
    死信队列死信队列:DLX,Dead-Letter-Exchange利用DLX,当消息在一个队列中变成死信(deadmessage)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLXDL......
  • 11-RabbitMQ高级特性-消息如何保证100%的投递成功
    消息如何保证100%的投递成功什么是生产端的可靠性投递保障消息的成功发出保障MQ节点的成功接收发送端收到MQ节点(Broker)确认应答完善的消息进行补偿机制BAT/TMD......