zoukankan      html  css  js  c++  java
  • 基本用法:4《类class-cls =模板 —实例化— <对象self =复制品》

    4 《类class-cls =模板 —实例化— <对象self =复制品》

    (1)类元素的【替换和新增】

     

     1 ##  1. 类
     2 #(1)类元素的【替换和新增】
     3 class Bi():
     4     h1 = 100
     5     h2 = -5.83
     6     h3 = 'abc'
     7 Bi.h1 = 99
     8 Bi.h4 = '新增一个变量'
     9 print(Bi.h1)
    10 print(Bi.h4)
    11 print('
    ')
    12 

     

     

     

    (2)调用 类【对象.属性】【对象.方法】

     1 # (2)调用 类【对象.属性】【对象.方法】
     2 ## 智能机器人
     3 class Ai():
     4     胸围 = 33    # 定义属性
     5     腰围 = 44
     6     def 卖萌():  # 定义方法
     7         print('主人,求抱抱!')
     8     def 奔跑():
     9         print('我奔跑……哎呦喂!撞了。')
    10 print(Ai.胸围)   # 调用属性
    11 print(Ai.腰围)
    12 Ai.卖萌()        # 调用方法
    13 Ai.奔跑()
    14 print('
    ')

     

    (3)【类函数】-内部属性调用:@classmethod函数声明

     

     1 # (1)【类函数】-内部属性调用:@classmethod函数声明
     2 class Ab():
     3     变量1 = 100
     4     变量2 = 200
     5     @classmethod         # 声明函数1是类方法,才能使用class的变量
     6     def 函数1(cls):      # cls是class的简写,函数1的第一个参数必须是cls
     7         print(cls.变量1) # 使用class的变量,必须注明出处,不能侵犯版权
     8         print(cls.变量2)
     9     def 函数2():         # 【不需要】使用类属性
    10         print('不需要加@classmethod和上面三处cls。')
    11 Ab.函数1()
    12 Ab.函数2()
    13 print('
    ')
    14 
    15 ## 智能机器人
    16 class Ai():
    17     胸围 = 33      # 定义属性
    18     腰围 = 44
    19     臀围 = 55
    20     def 函数1():   # 定义方法
    21         print('不需要加@classmethod和上面三处cls。')
    22     @classmethod       # 声明函数1是类方法,才能使用class的变量
    23     def 自报三围(cls): # cls是class的简写,函数1的第一个参数必须是cls
    24         print('主人,我的三围是:')
    25                        # 使用class的变量,必须注明出处,不能侵犯版权
    26         print('胸围:' + str(cls.胸围))
    27         print('腰围:' + str(cls.腰围))
    28         print('臀围:' + str(cls.臀围))
    29         print('哈哈哈哈哈,下面粗上面细,我长得像个圆锥。')
    30 Ai.函数1()        # 调用方法
    31 Ai.自报三围()     # 调用方法
    32 print('
    ')

     

     

     

    (4)【类函数】-外部参数传递+修改

     

     1 # (2)【类函数】-外部参数传递+修改
     2 class 类():
     3     def 函数(a):
     4         总和 = a + 100
     5         print('计算结果如下:')
     6         print(总和)
     7  ## 【类函数】外部参数修改
     8 a = int(input('输入一个整数:'))
     9 类.函数(a)
    10 print('
    ')

     

     

     

     

    实例:内部属性调用@classmethod & 外部参数传递

     

    A. 外部参数传递

     

    B. 内部属性调用@classmethod + 修改cls.a

     

     

     1 # (3)实例:内部属性调用@classmethod & 外部参数传递
     2 # A.外部参数
     3 诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
     4 class 念诗类():
     5     def 念诗函数(参数):
     6         print('你要念诗给:'+a+'听!')
     7         for i in 诗:
     8             print(i)
     9 a=input('给谁念诗:')  # 外部参数修改,直接传递
    10 念诗类.念诗函数(诗)
    11 print('
    ')
    12 
    13 # B.内部属性调用@classmethod + 修改cls.a= & 外部参数传递
    14 class 念诗类():
    15     诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
    16     @classmethod
    17     def 念诗函数(cls):
    18      ## 【类函数】内部修改参数+cls
    19         cls.a = input('请输入你想给谁念诗:')
    20         print('念给' + cls.a + '的诗:')
    21         for i in cls.诗:
    22             print(i)
    23 念诗类.念诗函数()
    24 print('
    ')

     

     

     

     

    (5)两种方法对比:【直接使用类】、【实例化对象】

     

    A. 直接使用类

     

     1 # 1. 直接使用类
     2 class 成绩单():
     3     @classmethod
     4     def 录入成绩单(cls):
     5         cls.学生姓名 = input('请输入学生姓名:')
     6         cls.语文_成绩 = int(input('请输入语文成绩:'))
     7         cls.数学_成绩 = int(input('请输入数学成绩:'))
     8     @classmethod
     9     def 打印成绩单(cls):
    10         print(cls.学生姓名 + '的成绩单如下:')
    11         print('语文成绩:'+ str(cls.语文_成绩))
    12         print('数学成绩:'+ str(cls.数学_成绩))
    13 成绩单.录入成绩单()
    14 成绩单.打印成绩单()
    15 print('
    ')

     

     

     

     

    B. 实例化之后

     

     1 # 2. 实例化之后
     2 # (1)实例化对象 和 直接使用类 的对比
     3 class 成绩单():   # ①不用再写@classmethod
     4     def 录入成绩单(self):  # ②cls变成self
     5     # ③cls.变成self.
     6         self.学生姓名 = input('请输入学生姓名:')
     7         self.语文_成绩 = int(input('请输入语文成绩:'))
     8         self.数学_成绩 = int(input('请输入数学成绩:'))
     9 
    10     def 打印成绩单(self):
    11         print(self.学生姓名 + '的成绩单如下:')
    12         print('语文成绩:'+ str(self.语文_成绩))
    13         print('数学成绩:'+ str(self.数学_成绩))
    14 成绩单1 = 成绩单() # ④创建实例对象:成绩单1
    15 成绩单1.录入成绩单() # ⑤实例化后使用
    16 成绩单1.打印成绩单()
    17 print('
    ')

     

     

     

     

    C. 改变实例/对象方法【类.原始函数=新函数】

     

    (实例化后是对象,对象只能调用方法,类可以改变方法)

     1 # (2)改变实例的方法【类.原始函数=新函数】
     2 class 幸运():
     3     def 好运翻倍(self):
     4         print('我是原始函数')
     5         print('翻了888倍:' + str(self.y*888))
     6 def a(self):
     7     print('我是新函数')
     8     print('翻了666倍:'+str(self.y *666))
     9 幸运.y=int(input('请输入一个整数。'))
    10 实例 = 幸运()    # 实例化
    11 实例.好运翻倍()  # 对象.原始函数
    12 幸运.好运翻倍=a  # 类.原始函数 = 新函数
    13 实例.好运翻倍()  # 对象.新函数

     

    (6)给类“传递参数”/ 生成不同实例:【初始化实例__init__(self)】

    A. 打印成绩单

     1 # 初始化函数__init__(self),生成不同的实例
     2 # (1)打印成绩单
     3 class 成绩单():
     4     def __init__(self,学生姓名,语文_成绩,数学_成绩):
     5         self.学生姓名 = 学生姓名
     6         self.语文_成绩 = 语文_成绩
     7         self.数学_成绩 = 数学_成绩
     8     def 打印成绩单(self):
     9         print(self.学生姓名 + '的成绩单如下:')
    10         print('语文成绩:'+ str(self.语文_成绩))
    11         print('数学成绩:'+ str(self.数学_成绩))
    12 成绩单1 = 成绩单('张三',99,88)  # 实例化
    13 成绩单2 = 成绩单('李四',64,73)
    14 成绩单3 = 成绩单('王五',33,22)
    15 成绩单1.打印成绩单()
    16 成绩单2.打印成绩单()
    17 成绩单3.打印成绩单()

     

    B. 【99乘法表】

     1 # (2)99乘法表
     2 class 乘法表():
     3     def __init__(self):
     4         self.k=int(input('输入整数1-10:'))
     5     # 内部定义属性
     6     def 打印(self):
     7     # k是init部门的员工,用的时候要和它的上司init说一下
     8     # ix是自己部门员工,不用加前缀
     9         for i in range(1,self.k+1):
    10             for x in range(1,i+1):
    11                 print('%d*%d=%d'%(i,x,i*x),end=' ')
    12             print(' ')
    13 结果 = 乘法表()  # 实例化
    14 结果.打印()

     

    (7)类的“同级调用”---【返回值return】

    ### 同级调用:

     

    ### 分为2大类:见【血量游戏-项目1-2种封装】

     

    ##### 1.def函数之间:全封装函数def-- 函数的同级调用:函数名(a,b,...)

     

    ##### 2.封装成类class-函数def-- 类函数的同级调用:self.函数名(a,b,...)

     

                         #  注意def时第一个位置是self:函数名(self,a,b,...)

     

     

     

    A. 【打印成绩单

     1 ##(1)打印成绩单
     2 class 成绩单():
     3     @classmethod
     4     def 录入成绩单(cls):
     5         cls.学生姓名 = input('请输入学生姓名:')
     6         cls.语文_成绩 = int(input('请输入语文成绩:'))
     7         cls.数学_成绩 = int(input('请输入数学成绩:'))
     8     @classmethod
     9     def 打印成绩单(cls):
    10         print(成绩单.学生姓名 + '的成绩单如下:')
    11         print('语文成绩:'+ str(成绩单.语文_成绩))
    12         print('数学成绩:' + str(成绩单.语文_成绩))
    13     @classmethod
    14     def 打印平均分(cls):
    15         平均分 = (cls.语文_成绩 + cls.数学_成绩) / 2
    16         return 平均分
    17         print('平均分:' + str(成绩单.平均分))
    18     @classmethod
    19     def 评级(cls):
    20         平均分=cls.打印平均分()   # 同级调用
    21         if 平均分>=90:
    22             print('评级:优')
    23         else:
    24             print('评级:差')
    25 成绩单.录入成绩单()
    26 成绩单.打印成绩单()
    27 成绩单.打印平均分()
    28 成绩单.评级()
    29         # elif 80<=平均分<90:
    30         #     print('评级:优')
    31         # elif 60<=平均分<80:
    32         #     print('评级:中')

     

     

    B. 【成绩单是否及格

     1 ##(2)是否及格
     2 class 成绩单():
     3     @classmethod
     4     def 录入成绩单(cls):
     5         cls.学生姓名 = input('请输入学生姓名:')
     6         cls.成绩 = int(input('请输入考试成绩:'))
     7     @classmethod
     8     def 计算是否及格(cls):
     9         if cls.成绩 >= 60:
    10             return '及格'
    11         else:
    12             return '不及格'
    13     @classmethod
    14     def 考试结果(cls):
    15         结果=cls.计算是否及格()     # 同级调用
    16         if 结果=='及格':
    17             print(cls.学生姓名+'同学考试通过啦!')
    18         else:
    19             print(cls.学生姓名 + '同学需要补考!')
    20 成绩单.录入成绩单()
    21 成绩单.计算是否及格()
    22 成绩单.考试结果()

     

     

    C. 【人事系统管理】

     

     

     1 # (3)人事系统管理
     2 class hrSystem:
     3     list=['bob', 'candy', 'jony', 'kelly']
     4     name = ''
     5     salary = 0
     6     kpi = 0  # 员工绩效 kpi
     7     @classmethod          ### A. 录入
     8     def record(cls, name, salary, kpi):
     9         cls.name = name
    10         cls.salary = salary
    11         cls.kpi = kpi
    12     @classmethod          ### B. 检查
    13     def check_name(cls):
    14         if cls.name in cls.list:
    15             print('
    录入正确!')
    16             return 1   # return 必须写在最后
    17         else:
    18             print('
    录入错误!spy不是本公司员工!')
    19             return 0
    20     @classmethod          ### C. 打印
    21     def print_record(cls):
    22         if cls.check_name():  # 同级调用,链接return返回值!
    23             print(cls.name + '的工作信息如下:')
    24             print('本月工资:' + str(cls.salary))
    25             print('本年绩效:' + str(cls.kpi))
    26         else:
    27             exit() # 不是员工无奖励,结束程序
    28     @classmethod          ### D. 奖励
    29     def kpi_reward(cls):
    30         final_kpi=cls.kpi
    31         if final_kpi > 95:
    32             print('恭喜'+cls.name+'拿到明星员工奖杯!')
    33         elif 80 <= final_kpi <= 95:
    34             print('恭喜' + cls.name + '拿到优秀员工奖杯!')
    35         else:
    36             print('很遗憾,'+cls.name+',希望来年勇创佳绩!')
    37 hrSystem.record('bob', 13000, 98)
    38 hrSystem.print_record()
    39 # check_name()通过print_record()调用
    40 # 所以不用写hrSystem.check_name()!!!
    41 hrSystem.kpi_reward()
    42 hrSystem.record('candy', 8000, 89)
    43 hrSystem.print_record()
    44 hrSystem.kpi_reward()
    45 hrSystem.record('k', 8000, 75)
    46 hrSystem.print_record()
    47 hrSystem.kpi_reward()

     

     

     

     

    (7)改装模板---类的“继承”:【子类】重写/添加【父类】

     

    A. 【打印成绩单

     1 ## (1)成绩单
     2 #【父类】
     3 class 成绩单_旧():
     4     def __init__(self,学生姓名,语文_成绩,数学_成绩):
     5         self.学生姓名 = 学生姓名
     6         self.语文_成绩 = 语文_成绩
     7         self.数学_成绩 = 数学_成绩
     8     def 打印成绩单(self):
     9         print(self.学生姓名 + '的成绩单如下:')
    10         print('语文成绩:'+ str(self.语文_成绩))
    11         print('数学成绩:'+ str(self.数学_成绩))
    12     def 打印平均分(self):
    13         平均分 = (self.语文_成绩 + self.数学_成绩)/2
    14         print(self.学生姓名 + '的平均分是:' + str(平均分))
    15 实例_旧 = 成绩单_旧('王明明',99,88)
    16 实例_旧.打印成绩单()
    17 实例_旧.打印平均分()
    18 print('
    ')
    19 #【子类】
    20 class 成绩单_新(成绩单_旧):
    21     def 打印总分(self):
    22         总分 = self.语文_成绩 + self.数学_成绩
    23         print(self.学生姓名 + '的总分是:' + str(总分))
    24 实例_新 = 成绩单_新('王明明',90,80)
    25 实例_新.打印成绩单()
    26 实例_新.打印平均分()
    27 实例_新.打印总分()
    28 print('
    ')

     

     

    B. 【机器人】

     

     1 ## (2)机器人
     2 #【父类】
     3 class 基础机器人():
     4     def __init__(self,参数):
     5         self.姓名 = 参数
     6     def 自报姓名(self):
     7         print('我是' + self.姓名 + '')
     8     def 卖萌(self):
     9         print('主人,求抱抱!')
    10 鲁宾 = 基础机器人('鲁宾')
    11 鲁宾.自报姓名()
    12 鲁宾.卖萌()
    13 print('
    ')
    14 #【子类】
    15 class 高级机器人(基础机器人):
    16     def __init__(self, 参数, 参数1):# 重写父类初始化函数
    17         self.姓名 = 参数
    18         self.智商 = str(参数1)
    19     def 自报姓名(self):   # 重写父类方法
    20         print(''+self.姓名 + ',智商是'+self.智商)
    21     def 高级卖萌(self):   # 添加新功能
    22         print('主人,我爱你!')
    23 安迪 = 高级机器人('安迪',180)
    24 安迪.自报姓名()
    25 安迪.高级卖萌()

     

     

     

     

    C. 【多类继承】

     

     1 # (3)多类继承
     2 class 基础机器人():
     3     def 卖萌(self):
     4         print('主人,求抱抱!')
     5 class 高级机器人():
     6     def 高级卖萌(self):
     7         print('主人,我爱你!')
     8 class 超级机器人(基础机器人, 高级机器人):
     9     def 超级卖萌(self):
    10         print('pika, qiu!')
    11         print(''' /\_)o<
    12 |      \
    13 | O . O|
    14  \_____/''')
    15 皮卡 = 超级机器人()
    16 皮卡.卖萌()
    17 皮卡.高级卖萌()
    18 皮卡.超级卖萌()

     

     

     

     

    D. 【出租车计费】

     

     1 # (4)出租车计费
     2 #【父类】
     3 class 出租车():
     4     def __init__(self,x1,x2,x3,x4):
     5         self.name=x1
     6         self.单价=x2
     7         self.起步 = x3
     8         self.起步费 = x4
     9     def 计费(self):
    10         self.record()
    11         self.output()
    12     def record(self):
    13         print(self.name + '每公里收费' + str(self.单价) + '元,',end='')
    14         print('起步'+str(self.起步)+'公里,起步费'+str(self.起步费)+'',end='')
    15         self.num = float(input('
    行程公里数:'))
    16     def output(self):
    17         if self.num<=self.起步:
    18             print('按起步费算:'+str(self.起步费))
    19         else:
    20             money=self.起步费+(self.num-3)*self.单价
    21             print('车费是:'+str(money)+'
    ')
    22      # money是本部员工,num/单价/最低费用是别部员工
    23 a = 出租车('张三', 2.5, 3.0, 15)
    24 a.计费()
    25 #【子类】
    26 class 电动车(出租车):   # 重新定义父类初始化函数
    27     def __init__(self,x1,x2,x3,x4):
    28         self.name = x1
    29         self.单价 = 0.8*x2
    30         self.起步 = x3
    31         self.起步费 = 0.8*x4
    32 b = 电动车('李四',2.5,3.0,15)
    33 b.计费()

     

     

    实例:【调查问卷系统】(考虑不同问题、参与人数)

     

     

     1 # (5)问卷调查类
     2 # 【父类】
     3 class Survey():
     4     def __init__(self,question):
     5         self.question = question
     6         self.list= []
     7         print(self.question)
     8     def store_response(self,a):
     9         self.list.append(a)
    10 f=Survey('你最喜欢的美食?')   # 实例化
    11 ### 父类外面的循环
    12 # while True:
    13 #     a=input('请回答,按 q 键退出:')
    14 #     if a=='q':
    15 #         break
    16 #     f.store_response(a) # 调用父类函数a=new
    17 # for i in f.response: # 实例.属性[]
    18 #     print('美食:'+i)
    19 # print('
    ')
    20 
    21 # 【子类】
    22 class New(Survey):
    23     def __init__(self,question):
    24         Survey.__init__(self,question) # 调用父类方法
    25         self.dict={}
    26     def store_response(self,n,j):
    27         self.dict[n]=j  # 添加字典的键和值
    28 h=New('你的籍贯地是哪?')
    29 ### 子类外面的循环
    30 while True:
    31     j=input('请回答,按 q 键退出:')
    32     if j=='q':
    33         break
    34     n=input('输入姓名:')
    35     h.store_response(n,j) # 调用父类函数a=new
    36 # for i in h.dict():      # 实例.属性{}
    37 #     print(i+':'+h.dict[i])
    38 for n,j in h.dict.items():   # 同时取键:值
    39     print(n+':'+j)

     

     

     

     

     

  • 相关阅读:
    查找->静态查找表->顺序查找(顺序表)
    查找(总结篇)
    树和二叉树->其他(待完善)
    树和二叉树->最优二叉树
    树和二叉树->线索二叉树
    树和二叉树->遍历
    树和二叉树->相互转化
    树和二叉树->存储结构
    树和二叉树->基础知识
    P2921-[USACO08DEC]在农场万圣节Trick or Treat on the Farm
  • 原文地址:https://www.cnblogs.com/lj-attitudes0303/p/10354632.html
Copyright © 2011-2022 走看看