• Class


    • 私有方法
    • __del__方法
    • 继承;多继承
    • 重写;
    • 多态;
    • 类属性;实例属性;
    • 类方法;实例方法;静态方法;
    • __new__方法
    • 创建单例对象
    • 异常
    • 模块自我测试和调用相冲突的解决办法
    • 设计4s店类(pass)
     
    私有方法:
    class Dog:
       #私有方法
       def __send_msg(self):
          print('------正在发送短信------')
       def send_msg(self,money):
          if money > 10000:
             self.__send_msg()
          else:
             print('-----您的余额不足,请充值-----')
     
    dog = Dog()
    dog.send_msg(5000)
    __del__方法:
    class Dog:
       def __del__(self):
          print('-----英雄over-----')
    dog1 = Dog()
    dog2 = dog1
     
    del dog1 #此时不会调用__del__方法,因为这个对象还有其他变量指向它,即引用计算不是0
    del dog2 #此时会调用__del__方法,因为已经没有变量指向它了
    print('=================')
    #如果在程序结束时,有些对象还存在,那么python解释器会自动调用它们的__del__方法来完成清理工作
    inherit:
    #INHERIT_ONE
    class Anaimal:
        def eat(self):
            print('-----eat-----')
        def drink(self):
            print('-----drink-----')
        def play(self):
            print('-----play-----')
        def run(self):
            print('-----run-----')
    class Dog(Anaimal):
        def bark(self):
            print('-----bark-----')
    class Cat(Anaimal):
        def catch(self):
            print('-----catch-----')
     
    tom = Cat()
    tom.eat()
    tom.catch()
    #if used tom.bark, you will get a error.
    #INHERIT_TWO
    class Anaimal:
        def eat(self):
            print('-----eat-----')
        def drink(self):
            print('-----drink-----')
        def play(self):
            print('-----play-----')
        def run(self):
            print('-----run-----')
    class Cat(Anaimal):
        def catch(self):
            print('-----catch-----')
    class Animation_Cat(Cat):
        def speak(self):
            print('-----speak-----')
     
    tom = Animation_Cat()
    tom.eat()
    tom.catch()
    tom.speak()
    #Tom can use Anaimal, Cat and Animation_Cat.  
    #INHERIT_ISSUE
    class Anaimal:
        def __init__(self):
            self.num = 'I can inherit!'
            self.__num = 1 #私有属性
        def __swim(self): #私有方法
            print('-----swim-----')
        def run(self):
            self.__swim() #公有方法下的私有属性
            print(self.__num) #公有方法下的私有方法
    class Cat(Anaimal):
        #Attention:如果是这里的公有方法下的私有属性或方法会报错,原因可以走一遍循环:先找自己的方法,找不到的话,如果是公有方法往父类上找,私有方法因为不能被继承,直接报错。
        pass
     
    tom = Cat()
    #tom.__swim() #AttributeError:私有method can't be inherit!
    #print(tom.__num) #AttributeError:私有属性 can't be inherit!
    print(tom.num)
    tom.run() #包含在共有属性中的私有方法和私有属性可以被继承!
     
    #Conclusion:一般来说,公有属性和公有方法会被继承,而私有属性和私有方法却不会被继承。但是存在两种特殊情况:如果是父类的公有方法下调用私有属性和私有方法会被继承。如果是子类的公有方法下调用私有属性和私有方法会报错
    #Conclusion:The general rule is that common attributes and common methods are inherited, private attributes and private methods are not inherited. But there are two kinds of special cases: ① If it is public methods of the parent with private property and private methods will be inherited. ② If it is public methods of the son with private property and private methods will not be inherited.
    #Multiple inheritance(多继承)
    class base(object):
        def test(self):
            print('-----test-----')
    class A(base):
        def test1(self):
            print('-----test1-----')
    class B(base):
        def test2(self):
            print('-----test2-----')
    class C(A,B):
        pass
     
    tom = C()
    tom.test()
    tom.test1()
    tom.test2()
     
    #多继承的注意点:print(tom.__mro__)
    #会打印调用一个方法时搜索的顺序(C3算法)
    #尽量避免在类中出现相同的方法
    REWRITE:
    #REWRITE_ONE
    class Anaimal:
        def eat(self):
            print('-----eat-----')
        def drink(self):
            print('-----drink-----')
        def play(self):
            print('-----play-----')
        def run(self):
            print('-----run-----')
    class Cat(Anaimal):
        def catch(self):
            print('-----catch-----')
    class Animation_Cat(Cat):
        def speak(self):
            print('-----speak-----')
        def catch(self):
            #if you rewrite 'catch', his father will be cover.
            print('-----not catch-----')
        
    tom = Animation_Cat()
    tom.eat()
    tom.catch()
    tom.speak()
    #REWRITE_TWO
    class Anaimal:
        def eat(self):
            print('-----eat-----')
        def drink(self):
            print('-----drink-----')
        def play(self):
            print('-----play-----')
        def run(self):
            print('-----run-----')
    class Cat(Anaimal):
        def catch(self):
            print('-----catch-----')
    class Animation_Cat(Cat):
        def speak(self):
            print('-----speak-----')
        def catch(self):
            print('-----not catch-----')
            #if you want to call son's catch first, then call father's catch.
            #the first method
            Cat.catch(self)
            #the second method
            super().catch()
     
    tom = Animation_Cat()
    tom.catch()
    polymorphism(多态):
    class Dog(object):
        def introduce(self):
            print('大家好,我是xxx')
    class Xiaotq(Dog):
        def introduce(self):
            print('hello,我是神犬')
    def function(temp):
        #只有在运行的时候才确定属于谁
        temp.introduce()
     
    dog1 = Dog()
    dog2 = Xiaotq()
    function(dog1)
    function(dog2)
    类属性和示例属性:
    class Tool(object):
        #类属性
        num = 0
        def __init__(self, new_name):
            #实例属性
            self.name = new_name
            #对类属性+1
            Tool.num += 1
     
    tool1 = Tool('铁锹')
    tool2 = Tool('工兵铲')
    tool3 = Tool('水桶')
    print(Tool.num)
    __new__方法:
    class Cat(object):
        def __init__(self):
            print('----init方法----')
        def __del__(self):
            print('----del方法----')
        def __str__(self):
            print('----str方法----')
        def __new__(cls):
            print('----new方法----,,,')
            return object.__new__(cls)
     
    tom = Cat()
    #并没有很懂,但是流程是先调用__new__,接收到它的返回值之后,调用__init__方法,而不是从__new__中调用__init__方法
    创建单例对象:
    class Cat(object):
        __instance = None
        #创建一个私有类属性
        def __new__(cls):
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
                return cls.__instance
            else:
                #返回上一次创建的对象的引用
                return cls.__instance
     
    tom = Cat()
    print(id(tom))
    cat = Cat()
    print(id(cat))
    #只初始化一次对象
    class Cat(object):
        __instance = None
        #创建一个私有类属性
        def __new__(cls, name):
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
                return cls.__instance
            else:
                #返回上一次创建的对象的引用
                return cls.__instance
        def __init__(self, name):
            self.name = name
     
    tom = Cat('汤姆')
    print(id(tom))
    print(tom.name)
    cat = Cat('小猫')
    print(id(cat))
    print(cat.name)
    #只初始化一次对象2
    class Cat(object):
        __instance = None
        __init_flag = False
        #创建一个私有类属性
        def __new__(cls, name):
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
                return cls.__instance
            else:
                #返回上一次创建的对象的引用
                return cls.__instance
        def __init__(self, name):
            if Cat.__init_flag == False:
                self.name = name
                Cat.__init_flag = True
     
    tom = Cat('汤姆')
    print(id(tom))
    print(tom.name)
    cat = Cat('小猫')
    print(id(cat))
    print(cat.name)
    异常:
    #异常处理-基本功能
    try:
        print(un)
        open('xxx.txt')
    except (NameError,FileNotFoundError):
        print('捕获到异常')
    except Exception as result:
        #Exception是所有异常的总称
        print('捕获到其他异常')
        print('result')
    else:
        print('没有异常才会执行的功能')
    finally:
        #无论上面是否出现异常,都会执行finally
        print('-----finally----')
        f.close()
        print('文件关闭')
    #异常的传递
    def test1():
        print(num)
    def test2():
        test1()
    def test3():
        try:
            test2()
        except Exception as result:
            print('已捕获到异常,异常信息为:(%s)'%result)
     
    test3()
    #抛出自定义异常
    class ShortInputException(Exception):
        #自定义的异常类
        def __init__(self, length, atleast):
            #super().__init__()
            self.length = length
            self.atleast = atleast
     
    def main():
        try:
            s = input('请输入字符:')
            if len(s) < 3:
                raise ShortInputException(len(s),3)
        except ShortInputException as result:
            print('ShortInputException:输入的长度是%d,长度至少是%d'%(result.length,result.atleast))
        else:
            print('noerror')
     
    main()
    #异常处理中抛出异常
    class Test(object):
        def __init__(self, switch):
            self.switch = switch #开关
        def calc(self, a, b):
            try:
                return a/b
            except Exception as result:
                if self.switch:
                    print('捕获开启,已经捕获到了异常,信息如下:')
                    print(result)
                else:
                    #重新抛出这个异常,此时就不会被这个异常处理给捕获到,从而触发默认的异常处理
                    raise
     
    a = Test(True)
    a.calc(11,0)
    print('---------------分割线--------------------')
    a.switch = False
    a.calc(11,0)
    #模块自我测试和调用相冲突的解决办法
    def test1():
        print('-----test1-----')
    def test2():
        print('-----test2-----')
    def main():
            test1()
            test2()
    if __name__ == '__main__':
        main()
     
  • 相关阅读:
    lsf运行lsload命令显示“lsload: Host does not have a software license”
    linux nfs远程挂载和卸载
    连接EMC存储系统
    linux 挂载ntfs格式的硬盘
    WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@584]
    循环更新sqlserver数据库表ID
    【BZOJ 1563】 (四边形优化、决策单调性)
    【BZOJ 3028】 3028: 食物 (生成函数)
    【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)
    【BZOJ 1061】 1061: [Noi2008]志愿者招募 (线性规划与网络流)**
  • 原文地址:https://www.cnblogs.com/changwoo/p/9601868.html
Copyright © 2020-2023  润新知