• day02_面向对象


    !/usr/bin/env python

    coding: utf-8 -*-

    开发团队: 奶豆的小铺

    开发人员: bcz

    开发时间: 2020/11/22 20:17

    继承应用场景,修改已有的源代码或者web框架源代码

    `class Web():

    def show(self,*args):
        print(args)
    

    `

    现在需求在Web内部show方法中增加一点功能

    
    class Base_Web(Web):
    
        def show(self):
            super(Base_Web, self).show('lihua','joe','mary')
            print('这是子类的show方法')
    
    
    obj = Web()
    obj.show(1,2,3)
    
    obj2 =Base_Web()
    obj2.show()
    

    继承多个类,继承的顺序从左到右,一条路走到黑,在走另一条路,如如果有共同的根
    ``先去另一条路找,最后找共同的根

    class F0():
        def a(self):
            print('F0.a')
    
    
    class F1(F0):
        def a1(self):
            print('F1.a1')
    
    
    
    class F2():
        def a(self):
            print('F2.a')
    
    class S(F1,F2):
        print('继承同样方法的顺序')
    
    s = S()
    s.a()
    

    一个类中的函数调用另一个函数

    class BaseCls():
        def __init__(self):
            print('BaseCls.__init__')
    
    
    class RequestHanlder(BaseCls):
    
        def __init__(self):
            print('RequestHanlder.__init__')
            BaseCls.__init__(self)
        #self指的是调用该方法的对象 obj3
        def  server_forever(self):
            print('RequestHanlder.erver_forever')
            self.process_request()
    
        def process_request(self):
            print('RequestHanlder.process_request')
    
    
    class Minx():
    
        def process_request(self):
            print('Minx.process_request')
    
    
    class Son(Minx,RequestHanlder):
        pass
    
    
    obj3 = Son()
    
    obj3.process_request()
    obj3.server_forever()
    

    练习游戏人生游戏

    class Person():
    
        def __init__(self,name,age,gender,fight):
            self.name = name
            self.age = age
            self.gender = gender
            self.fight = fight
    
    
        def incest(self):
            '''
            多人游戏,消耗500战斗力
            :return:
            '''
            self.fight -=500
    
        def  practice(self):
            '''
            锻炼,增加100战斗力
            :return:
            '''
            self.fight +=100
    
        def war(self):
            '''草丛战斗,消耗200战斗力'''
    
            self.fight -= 200
    
        def detail(self):
            '''当前对象的详细情况'''
            temp = f'姓名:{self.name},年龄:{self.age},性别:{self.gender}' 
                f'战斗力:{self.fight}'
            print(temp
    
    while True:
        y_n = input('是否创建角色: ')
        if y_n == 'y':
            name = input('请输入姓名: ')
            age = int(input('请输入年龄: '))
            gender = input('请输入性别: ')
            fight = int(input('请输入战斗力: '))
            p = Person(name, age, gender, fight)
            while True:
                action = input('请输入此人的行为: ')
    
                if action == 'incest':
                    p.incest()
    
                elif action == 'war':
                    p.war()
    
                elif action == 'practice':
                    p.practice()
                else:
                    break
                p.detail()
            p.detail()
    
        else:
            break
    

    类成员包括

    字段 =============》带self保存在对象中----》普通字段,执行职能通过对象访问

    =============》保存在类中---------》静态字段,执行时可以通过类和对象访问 ----》

    方法 =============》保存在类中

    三种方法

        #-普通方法,保存在类中,一般由对象来调用
        #-静态方法,在普通方法前面加上@staticmethod装饰器,self就不是必须的参数了,类也就可以直接调用该方法,而不用事先创建一个类的对象当然也可以通过对象进行访问
        #类方法:和staticmethod相似 ,参数必须有,为cls,指的是类名,可由类调用
    

    静态方法和静态字段是可以不用创建对象直接进行调用或访问,节省内容

    对象中包含指向类的指针,进而能够找到类中的方法和字段

    应用场景

    如果对象中需要保存一些值,执行某功能时,需要使用对象的值,----》使用普通方法

    如果不需要任何对象中的值,---》静态方法

    需求中国所有省份

    class Province():
        country = 'china'
    
        def __init__(self,name):
            self.name = name
    
        #普通方法
        def show(self):
            print(self.name)
            print(self.country)
    
        @staticmethod
        def sta():
            print('hhhh')
    
        @staticmethod
        def stac(a,b):
            print(a+b)
    
        @classmethod
        def  classmd(cls):
            #cls指的是类名
            print(cls)
            print('类方法')
    
        #属性 执行操作是jilin.bar
        @property#将bar方法转换为属性
        def bar(self):
            print('vba')
            return 'hhaha'
        #执行操作是jilin.bar = 123
        @bar.setter
        def bar(self,val):
            print(val)
    
        @bar.deleter
        def bar(self):
            print('suibian')
    
    liaoning = Province('辽宁')
    liaoning.show()
    jilin = Province('吉林')
    jilin.show()
    print(jilin.name)
    print(jilin.country)
    print(Province.country)
    
    
    Province.sta()
    liaoning.sta()
    Province.stac(3,2)
    jilin.stac('辽宁','朝阳')
    
    
    Province.classmd()
    jilin.classmd()
    
    res = jilin.bar#<=====>@property操作
    print(res)
    
    jilin.bar = 123#<=====>@bar.setter操作
    
    
    del jilin.bar#<=====> @bar.deleter操作
    
    
    
    
    #属性的另一种表达方式,django源码中有体现
    
    
    class Foo2():
    
        @property
        def f1(self):
            return 'hello'
    
        def f2(self,val):
            print(val)
    
        # per = property(fget = f1,fset = f2)
    
        # @property
        # def f1(self):
        #     return 'hello'
    
    obj1 = Foo2()
    rest = obj1.f1
    print(rest)
    # rest = obj1.per
    # print(rest)
    #
    # obj1.per = 'hello world'
    
    
  • 相关阅读:
    js获取长度,根据编码获取长度
    springcloud(七,多个服务消费者配置,以及zuul网关案例)
    springcloud(六,多个服务提供者)
    springcloud(五,多个服务注册中心eureka)
    jquery根据选择器进行页面赋值,封装赋值方法
    让页面元素无法选中,不能全选
    取消绑定事件
    js设置元素指定时间隐藏
    js手动抛出异常
    php 之 数据访问 查询关键字 (0506)
  • 原文地址:https://www.cnblogs.com/lihuafeng/p/14025829.html
Copyright © 2020-2023  润新知