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'

原文地址:https://www.cnblogs.com/lihuafeng/p/14025829.html