• 面向对象-2


    隐藏属性

    class Dog:
        def set_age(self,new_age):
            if new_age > 0  and new_age <=100:
                self.age = new_age
            else:
                self.age = 0
        def get_age(self):
            return self.age
    dog = Dog()
    dog.set_age(-10)
    age = dog.get_age()
    print(age)

    私有方法

    class Dog:
        #私有方法
        def __send_msg(self):
            print("----正在发送短信----")
        #公有方法
        def send_msg(self,new_money):
            if new_money > 1000:
                self.__send_msg()
            else:
                print("余额不足,请先充值再发送短信")
    
    dog = Dog()
    dog.send_msg(10000)

    __del__方法

    class Dog:
        def __del__(self):
            print("----英雄over----")
    dog1 = Dog()
    dog2 = dog1
    del dog1 #只有这一行时,先打印==,再打印over,==后没有代码,才删除引用
    del dog2 #有这行时,引用会被先删除完,才打印==
    print("================")

    对象的引用个数 

    import sys
    class T:
        pass
    
    t = T()
    print(sys.getrefcount(t)) #getrefcount(),测量一个对象引用计数时引用必须要存在一个。getrefount()还会自己占用一个。
    
    tt = t
    print(sys.getrefcount(tt))

    继承class Animal:

    def eat(self):
            print("---吃---")
        def drink(self):
            print("---喝---")
        def sleep(self):
            print("---睡觉---")
        def run(self):
            print("---跑---")
    class Dog(Animal):
        def bark(self):
            print("---汪汪叫---")
    class Cat(Animal):
        def catch(self):
            print("---抓老鼠---")
    
    class Xiaotq(Dog):
        def fly(self):
            print("---飞---")
    wangcai
    = Dog() wangcai.eat() xtq = Xiaotq() xtq.fly() xtq.bark() xtq.eat()

    重写

    class Animal:
        def eat(self):
            print("---吃---")
        def drink(self):
            print("---喝---")
        def sleep(self):
            print("---睡觉---")
        def run(self):
            print("---跑---")
    class Dog(Animal):
        def bark(self):
            print("---汪汪叫---")
    class Cat(Animal):
        def catch(self):
            print("---抓老鼠---")
    
    class Xiaotq(Dog):
        def fly(self):
            print("---飞---")
        def bark(self): #此处重写父类bark()方法
            print("---狂叫---")
    
    wangcai = Dog()
    wangcai.eat()
    
    xtq = Xiaotq()
    xtq.fly()
    xtq.bark() #---狂叫---,调用自己的,非父类的
    xtq.eat()

    调用被重写的方法

    class Animal:
        def eat(self):
            print("---吃---")
        def drink(self):
            print("---喝---")
        def sleep(self):
            print("---睡觉---")
        def run(self):
            print("---跑---")
    class Dog(Animal):
        def bark(self):
            print("---汪汪叫---")
    class Cat(Animal):
        def catch(self):
            print("---抓老鼠---")
    
    class Xiaotq(Dog):
        def fly(self):
            print("---飞---")
        def bark(self):
            print("---狂叫---")
            #第1种调用被重写父类的方法
            # Dog.bark(self) #调用父类的bark(),self必须传
            #第2种
            super().bark()
    wangcai = Dog()
    wangcai.eat()
    
    xtq = Xiaotq()
    xtq.fly()
    xtq.bark() #---狂叫---,调用自己的,非父类的
    xtq.eat()

    私有方法、私有属性在继承中的表现

    如果调用的是继承父类中的公有方法,可以在这个公有方法中访问父类中的私有属性和私有方法

    但是如果在子类中实现了一个公有方法,那么这个方法不能够调用继承的父类中的私有方法和私有属性

    class A:
        def __init__(self):
            self.num1 = 100
            self.__num2 = 200
        def test1(self):
            print("---test1---")
        def __test2(self):
            print("---test2---")
        def test2(self):
            self.__test2()
            print(self.__num2)
        def test3(self):
            self.__test2()
            print(self.__num2)
    class B(A):
        def test4(self):
            self.__test2()
            print(self.num2)
    
    b = B()
    b.test1()
    # b.__test1() #私有方法不会被继承
    print(b.num1)
    # print(b.__num2) #私有属性不能被继承
    b.test3()
    b.test4() #调用报错

    继承

    class Base(object): #新式类
        def test(self):
            print("---Base")
    class A(Base):
        def test1(self):
            print("---A")
    class B(Base):
        def test2(self):
            print("---B")
    
    class C(A,B): #继承多个父类
        def test(self):
            print("---V")
    
    c = C()
    c.test()
    c.test1()
    c.test2()

    多继承搜索顺序

    class Base(object): #新式类
        def test(self):
            print("---Base")
    class A(Base):
        def test(self):
            print("---A")
    class B(Base):
        def test(self):
            print("---B")
    
    class C(A,B): #继承多个父类
        pass
    
    c = C()
    c.test()
    print(C.__mro__)  #调用test()方法时,搜索的顺序,如果在某个类中找到了方法,就停止搜索

    类属性和实例属性

    实例属性:和具体的某个实例对象有关系,并且一个实例对象和另个一个实例对象不能共享属性

    类属性:类属性属于类对象,并且多个实例对象之间共享同一个类属性

    __init__方法在类中也只存在一份,每个实例对象中存有__init__方法的引用

    class Tool(object):
        #类属性
        num = 0
        #方法
        def __init_(self, new_name):
            #实例属性
            self.name = new_name
            #调用类属性
            Tool.num += 1
            
    tool1 = Tool("铁锹")
    tool2 = Tool("工兵铲")

    实例方法,类方法、静态方法

    class Game(object):
        #类属性
        num = 0
        #实例方法,必须有self参数
        def __init__(self):
            #实例属性
            self.name = "laowang"
    
        #类方法,需要有cls参数
        @classmethod
        def add_num(cls):
            cls.num = 100
    
        #静态方法,可以没有参数
        @staticmethod
        def print_menu():
            print("-------------------------")
            print(" 穿越火线V11.1 ")
            print(" 1.开始游戏")
            print(" 2.结束游戏")
            print("-------------------------")
    
    game = Game()
    #Game.add_num() #通过类名调用类方法
    game.add_num() #类的实例调用类方法
    print(Game.num)
    
    # Game.print_menu() #通过类调用静态方法
    game.print_menu() #通过实例对象调用静态方法

    设计4S类

    class CarStore(object):
        def __init__(self):
            self.factory = Factory()
    
        def order(self,car_type):
            return self.factory.select_car_by_type(car_type)
    
    class Factory(object):
        def select_car_by_type(self,car_type):
            if car_type == "索纳塔":
                return Sonata()
            elif car_type == "名图":
                return Mingtu()
    
    
    class Car(object):
        def move(self):
            print("车在移动...")
        def music(self):
            print("正在听音乐...")
        def stop(self):
            print("车在停止...")
    
    class Sonata(Car):
        pass
    class Mingtu(Car):
        pass
    
    
    car_store = CarStore()
    car = car_store.order("索纳塔")
    car.move()
    car.music()
    car.stop()

    工厂方法模式

    class Store(object):
        def select_car(self): #共有功能放基类中,但不实现,由子类实现
            pass
    
        def order(self,car_type):
            return self.select_car(car_type)
    
    class BMWCarStore(Store): #子类继承父类的select_car和order方法,
        # 继承完了后order方法调用子类本身的select_car方法
        def select_car(self,car_type):
            return BMWFactory().select_car_ty_type(car_type)
    
    
    class CarStore(Store):
        def select_car(self,car_type):
            return Factory().select_car_ty_type(car_type)
    
    class BMWFactory(object):
        def select_car_by_type(self,car_type):
            if car_type == "X1":
                return X1()
            elif car_type == "320li":
                return X6()
    class Factory(object):
        def select_car_by_type(self,car_type):
            if car_type == "索纳塔":
                return Sonata()
            elif car_type == "名图":
                return Mingtu()
    
    
    class Car(object):
        def move(self):
            print("车在移动...")
        def music(self):
            print("正在听音乐...")
        def stop(self):
            print("车在停止...")
    
    class Sonata(Car):
        pass
    class Mingtu(Car):
        pass
    class X1():
        pass
    class X6():
        pass
    
    
    car_store = CarStore()
    car = car_store.order("索纳塔")
    car.move()
    car.music()
    car.stop()
    
    bmw_store =BMWCarStore()
    bmw = bmw_store.order("X6")

    __new__方法

    class Dog(object):
        def __init__(self):
            pass
        def __del__(self):
            pass
        def __str__(self):
            return "对象的描述信息"
        def __new__(cls): #cls此时是Dog指向那个类对象
            print("----new方法----")
            return object.__new__(cls) #重写了父类方法,必须调用父类的new方法,不然创建对象不成功。
    
    #1.调用__new__方法创建对象,找一个变量来接收__new__的返回值,这个返回值表示创建出来的对象的引用,负责创建
    #2.__init__(刚刚创建出来的对象的引用),负责初始化
    #3.返回对象的引用
    xtq = Dog()

    创建单例对象

    class Dog(object):
        __instance = None
        def __new__(cls):
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
                return cls.__instance
            else:
                return cls.__instance #上一次创建的对象
    
    a = Dog()
    b = Dog()
    print(id(a))
    print(id(b))

    只初始化一次对象1

    class Dog(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
    
    a = Dog("旺财")
    print(a.name)
    b = Dog("哮天")
    print(b.name)
    print(id(a))
    print(id(b))

    只初始化一次对象2

    class Dog(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 Dog.__init_flag == False:
                self.name = name
                Dog.__init_flag = True
    
    
    a = Dog("旺财")
    print(a.name)
    b = Dog("哮天")
    print(b.name)
    print(id(a))
    print(id(b))
  • 相关阅读:
    go多种uuid生成方式
    go访问mysql基本语法
    go实现分布式唯一ID-snowflake(雪花算法)
    指定时间生成cron表达式
    zookeeper注册与发现
    短地址服务(二)
    java-redis
    短地址服务(一)
    cron表达式详解
    以后本blog所有内容全部转移,并在自建blog更新
  • 原文地址:https://www.cnblogs.com/rongpeng/p/12514753.html
Copyright © 2020-2023  润新知