zoukankan      html  css  js  c++  java
  • 面向对象基础(三)

    # 面向对象继承的主要作用是
    # 优化代码,节省代码.
    # 提高代码的复用性.
    # 提高代码的维护性.
    # 让类与类之间发生关系.
    
    # 例:
    class Parent:
        def __init__(self):
            self.func()
    
        def func(self):
            print('Parent')
    
    class Son(Parent):
        def __init__(self):
            self.func()
    
        def func(self):
            print('Son')
    
    son1 = Son()
    # result:Son,继承中优先使用派生类中的方法
    
    class A:
        lst = []
    
    
    p1 = A()
    p2 = A()
    p1.lst.append(1)
    
    print(p1.lst,p2.lst,A.lst)
    
    # result:[1] [1] [1],列表是可变数据类型,这里可以参考函数默认值使用的都是同一块内存地址
    
    
    class A:
        name = 'Tian'
    
    
    p1 = A()
    p2 = A()
    p1.name = 'wuser'
    
    print(p1.name,p2.name,A.name)
    
    # result:wuser Tian Tian str类型是可hash的对象只能访问类的静态字段无法修改
    # python中是没有接口这个概念的
    # 接口类,抽象类: 制定一个规范。
    # 归一化设计
    
    class Alipay:
        def __init__(self,money):
            self.money = money
    
        def pay(self):
            print('支付了%s' %self.money)
    
    
    class Jdpay:
        def __init__(self,money):
            self.money = money
    
        def pay(self):
            print('支付了%s' %self.money)
    
    
    apay = Alipay(100)
    jpay = Jdpay(200)
    
    apay.pay()
    jpay.pay()
    # 支付是一个统一的概念,这里明显无法统一,那如何实现统一
    
    def pay(obj):
        obj.pay()
    pay(apay)
    
    # 这样是不是看起来统一了,这就是归一化设计抽象类也是借鉴了这个概念
    from abc import ABCMeta,abstractmethod
    
    class Payment(metaclass=ABCMeta):
            #装饰器 制定一个规范当派生类缺失pay方法时会报错
            @abstractmethod
            def pay(self): pass  # 制定了一个规范
    
    
    
    class Alipay(Payment):
        def __init__(self,money):
            self.money = money
    
        def pay(self):
            print('支付了%s' %self.money)
    
    
    class Jdpay(Payment):
        def __init__(self,money):
            self.money = money
    
        # def pay(self):
        #     print('支付了%s' %self.money)
    
    apay = Alipay(100)
    jpay = Jdpay(200)
    
    # result:TypeError: Can't instantiate abstract class Jdpay with abstract methods pay
    # python中没有多态的概念,但他有鸭子类型
    
    # class Str:
    #     def index(self):
    #         pass
    
    # class List:
    #     def index(self):
    #         pass
    #
    # class Tuple:
    #     def index(self):
    #         pass
    
    # 当三个类中的方法相同时我们称其为鸭子类型
    # 广义的封装: 实例化一个对象,给对象空间封装一些属性.
    # 狭义的封装: 私有制.
    # 私有成员:私有静态字段,私有方法,私有对象属性
    
    class A:
        # 这就是A类的私有静态字段只有在A类内部调用时才能访问,外部无论是派生类还是实例都无法访问
        __money = 1000
    
    a1 = A()
    
    # print(a1.__money)
    # print(A.__money)
    # 报错,这里有个bug因为python设计的时候会在私有字段前面加类名
    print(a1._A__money)
    # 这是python设计问题没有人会这么用
    
    class Parent:
        def __func(self):
            print('in Parent func')
    
        def __init__(self):
            self.__func()
    
    class Son(Parent):
        def __func(self):
            print('in Son func')
    
    son1 = Son()
    
    # result:in Parent func
    class Person:
        def __init__(self,name,sex,age):
            self.__name = name
            self.__sex = sex
            self.age = age
    
        def func(self):
            print(self.__name)
    
    
    p1 = Person(1,2,3)
    
    # print(p1.__name)  报错
    p1.func()
    # 在类内部执行__name时他会在前面添加_Person
  • 相关阅读:
    素数路径Prime Path POJ3126 素数,BFS
    Fliptile POJ3279 DFS
    Find the Multiple POJ1426
    洗牌Shuffle'm Up POJ3087 模拟
    棋盘问题 POJ1321 DFS
    抓住那只牛!Catch That Cow POJ3278 BFS
    Dungeon Master POJ2251 三维BFS
    Splitting into digits CodeForce#1104A
    Ubuntu下手动安装Nvidia显卡驱动
    最大连续子序列和
  • 原文地址:https://www.cnblogs.com/tengx/p/11865525.html
Copyright © 2011-2022 走看看