!/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'