Python面向对象

打印 上一主题 下一主题

主题 495|帖子 495|积分 1485

 


1.面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。


  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类
  • 实例化:创建一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
1.1.Python类的语法
  1. class  类名():#括号可有可无
  2.   类属性
  3.   类函数/类方法
复制代码
  1. <strong>类名规范</strong>:数字/字幕/下划线组成,不能以数字开头,首字母大写,驼峰命名
复制代码
  1. #类
  2. class BoyFriend():
  3.     #类属性
  4.     height=170
  5.     weight=105
  6.     money="1000W"
  7.     #类函数
  8.     def cooking(self):#(self指实例本身)#会做饭
  9.         print("女朋友会做饭")
  10.     def earn(self):#会赚钱
  11.         print("女朋友会赚钱")
  12. #实例化话对象
  13. by = BoyFriend()
  14. #调用类函数
  15. by.cooking()
复制代码
  1. <strong>#self</strong><br>self代表类的实例,而非类
  2. 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
复制代码
  1. class Test:
  2.     def prt(self):
  3.         print(self)
  4.         print(self.__class__)
  5. t = Test()#隐士实例传递,最终传递self
  6. t.prt()
复制代码
  1. 以上实例执行结果为:
复制代码
  1. <__main__.Test instance at 0x100771878>
  2. __main__.Test
复制代码
1.2.实例方法
  1. #类方法智能通过实例调用
  2. t = Test()#实例
  3. t.cooking()
复制代码
1.3.类方法  @classmethod
  1. #类
  2. class BoyFriend():
  3.     #类函数
  4.     height=170
  5.     weight=105
  6.     money="1000W"
  7.     #类函数
  8.     def cooking(self):#会做饭
  9.         print("女朋友会做饭")
  10.     @classmethod#类方法不能调用类里面的属性值
  11.     def earn(self):
  12.         print("女朋友会赚钱")
  13. BoyFriend.earn()#调用成功
  14. BoyFriend.cooking()#报错:TypeError: cooking() missing 1 required positional argument: 'self'
复制代码
1.4.静态方法  @staticmethod
  1. #类
  2. class BoyFriend():
  3.     #类函数
  4.     height=170
  5.     weight=105
  6.     money="1000W"
  7.     #类函数
  8.     def cooking(self):#会做饭
  9.         print("女朋友会做饭")
  10.     #类方法
  11.     @classmethod
  12.     def earn(self):#会赚钱
  13.         print("女朋友会赚钱")
  14.     #静态方法
  15.     @staticmethod#静态方法不能调用类里面的属性值
  16.     def music():
  17.         print("女朋友会唱歌")
  18. BoyFriend.music()#女朋友会唱歌
复制代码
1.5.类的初始化函数
初始化函数再实例化对象的时候调用
  1. class Teacher:
  2.     def __init__(self):#这是初始化函数
  3.         print("这是初始化函数")
  4.     def speak(self):
  5.         print("这是类函数")
  6. t = Teacher()
  7. #打印结果:这是初始化函数
复制代码
1.6.初始化函数传参
  1. class Teacher:
  2.     def __init__(self,name,age):#初始化函数传参
  3.         self.n = name#将初始化参数赋值给类属性
  4.         self.a = age
  5.     def speak(self):
  6.         print("老师的名字是:{0},老师的年龄是:{1}".format(self.n,self.a))
  7. t = Teacher("张三","18")#传参必须与类初始化参数一致
  8. t.speak()
  9. #打印结果:老师的名字是:张三,老师的年龄是:18
复制代码
  1. class Teacher:
  2.     def __init__(self,name="张三",age="18"):#初始化函数传参
  3.         self.n = name#将初始化参数赋值给类属性
  4.         self.a = age
  5.     def speak(self):
  6.         print("老师的名字是:{0},老师的年龄是:{1}".format(self.n,self.a))
  7. Teacher().speak()#老师的名字是:张三,老师的年龄是:18
复制代码
2.1.继承
  1. #子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。<br>#父类有的集成后,子类可以直接拿来用<br>#父类有,子类也有重名的函数,那么子类的实例优先调用子类的函数<br>#父类只能调用自己函数和属性
复制代码
  1. #第一代机器人
  2. class RoboOne():
  3.     def __init__(self,year,name):
  4.         self.year=year#生产日期
  5.         self.name=name#名字
  6.     def xingzou(self):
  7.         print("可以在平地上行走!")
  8.     def biaoshi(self):
  9.         print("{0}年生产的机器人{1},是中国研发的!".format(self.year,self.name))
  10. #第二代机器人继承第一代机器人的类
  11. class RoboTwo(RoboOne):#集成父类<br>
  12.     def xingzou(self):#子类里面的韩树明与父类函数名重复的时候,就是重写
  13.         print("可以在平地上平稳的行走!")
  14.     def bizhang(self):
  15.         print("可以避开障碍物!")<br><br><br>r = RoboTwo("2022","哇卡哇卡")
  16. r.xingzou()#可以在平地上平稳的行走!
  17. r.bizhang()#可以避开障碍物!
  18. r.biaoshi()#2022年生产的机器人哇卡哇卡,是中国研发的!
复制代码
2.2.子类中调用父类中的函数
  1. #第一代机器人
  2. class RoboOne():
  3.     def __init__(self,year,name):
  4.         self.year=year#生产日期
  5.         self.name=name#名字
  6.     def xingzou(self):
  7.         print("可以在平地上行走!")
  8.     def biaoshi(self):
  9.         print("{0}年生产的机器人{1},是中国研发的!".format(self.year,self.name))
  10. #第二代机器人继承第一代机器人的类
  11. class RoboTwo(RoboOne):
  12.     def xingzou(self):#子类里面的韩树明与父类函数名重复的时候,就是重写
  13.         print("可以在平地上平稳的行走!")
  14.     def bizhang(self):
  15.         #子类中调用父类的方法(调用子类未重写的方法)
  16.         self.biaoshi()
  17.         print("可以避开障碍物!")<br><br><br>r = RoboTwo("2022","卢卡卢卡")
  18. r.bizhang()
  19. # 打印结果:
复制代码
  1. 2022年生产的机器人卢卡卢卡,是中国研发的!
  2. 可以避开障碍物!
复制代码
2.3.多继承
继承多个父类
#继承多个父类时父类中函数重名,根据排序先后进行调用(就近原则)
#初始化函数根据就近原则进行传参
  1. class Father():#父类
  2.     def __init__(self,name,car):
  3.         self.name=name
  4.         self.car=car
  5.         
  6.     def zuojia(self):
  7.         print("{0}的座驾是{1}".format(self.name,self.car))
  8.     def computer(self):
  9.         print("有一台Mac!")
  10. class WangSir():#老王,为什么是老王,这是个迷!!!!
  11.     def __init__(self,name,car):
  12.         self.name=name
  13.         self.car=car
  14.     def zuojia(self):
  15.         print("{0}的座驾是{1}".format(self.name,self.car))
  16.     def Money(self):
  17.         print("有500W")
  18. class Son(WangSir,Father):#继承两个父类
  19.     def age(self):
  20.         print("我满18岁了!")<br><br><br>s = Son("李刚","法拉利")
  21. s.zuojia()#
  22. s.age()
  23. s.computer()
  24. s.Money()
  25. 打印:
复制代码
  1. 李刚的座驾是法拉利
  2. 我满18岁了!
  3. 有一台Mac!
  4. 有500W
复制代码
2.4.练习一
  1. # 1)创建一个类名为User的类
  2. # 2)其中包含属性first_name和last_name
  3. # 3)还有用户简介通常会存储的其他几个属性,均是自定义,请放在初始化函数里面
  4. # 4)在类User中定义一个名为describe_user()的方法,它打印用户信息摘要
  5. # 5)再定义一个名为greet_user()的方法,它向用户发出个性化的问候
  6. # 6)创建多个表示不同用户的实例,并将每个实例都调用上述两个方法
  7. class User():
  8.     def __init__(self,first_name,last_name,*args):
  9.         self.first_name=first_name
  10.         self.last_name=last_name
  11.         self.args=args
  12.     def describe_user(self):
  13.         print("问候新冠肺炎!!!!")
  14.     def greet_user(self):
  15.         print("{0}{1}的简介:{2}".format(self.first_name,self.last_name,self.args))
  16. u = User("张","三","喜欢打雪仗","喜欢狗刨式","喜欢掉冰窟窿")
  17. u.describe_user()
  18. u.greet_user()
复制代码
2.5.练习二
  1. #人和机器人猜拳<br>#1)函数1:选择角色1曹操,2张飞,3刘备<br>#2)函数2:角色猜拳1剪刀,2石头,3布,玩家输入一个1-3的数字<br>#3)函数3:电脑出拳,随机产生1个1-3的数字,提示电脑出拳结果<br>#4)函数4:角色和机器出拳对战,对战结束后,最后出示本局对战结果...赢...输,然后提示用户是否继续?按y继续,按n结束<br>#5)最后结束的时候输出结果,角色赢几局,电脑输几局,平局几次,游戏结束
复制代码
  1. import random#随机数
  2. # 猜拳
  3. class Guess():
  4.     #选择角色
  5.     def role(self):
  6.         num = input("请选择角色(1曹操,2张飞,3刘备)请输入:")
  7.         print("选择角色:{0}".format(self.role_obtain(num)))
  8.         print("************ 游戏开始 ************")
  9.         print()
  10.         self.DuelWar(self.role_obtain(num))#调用对战
  11.         # print("角色:{0},猜拳游戏马上开始!".format())
  12.     #角色出拳
  13.     def person_guess(self):
  14.         guess = input("请出拳(1剪刀,2石头,3布)请输入:")
  15.         return int(guess)
  16.     #电脑出拳
  17.     def computer_guess(self):
  18.         num = random.randint(1,3)#随机1-3
  19.         return int(num)
  20.     #角色转换(数字转角色)
  21.     def role_obtain(self,num):
  22.         try:
  23.             dict = {"1":"曹操","2":"张飞","3":"刘备"}
  24.             return dict[str(num)]
  25.         except Exception as e:
  26.             print("角色转换(数字转角色)异常:{0}".format(e))
  27.     #出拳转换
  28.     def boxing_obtain(self,num):
  29.         try:
  30.             dicts = {"1":"剪刀", "2":"石头", "3":"布"}
  31.             return dicts[str(num)]
  32.         except Exception as e:
  33.             print("出拳转换异常:{0}".format(e))
  34.     #对战
  35.     def DuelWar(self,role_name):
  36.         contin = "y"
  37.         num=0#局数
  38.         person_num = 0#角色赢数
  39.         computer_num=0#电脑输数
  40.         even = 0#平局数
  41.         while contin=="y":
  42.             num+=1#
  43.             print("************ 第 {0} 局 ************".format(num))
  44.             person_x = self.person_guess()#角色出拳
  45.             computer_x = self.computer_guess()#电脑出拳
  46.             #判断角色赢
  47.             if (person_x==1 and computer_x==3) or (person_x==2 and computer_x==1) or (person_x==3 and computer_x==2):
  48.                 print("第{0}局 >>>>>>>>>>>>{1}>{2} :赢".format(num,self.boxing_obtain(person_x),self.boxing_obtain(computer_x)))
  49.                 print()
  50.                 person_num+=1
  51.             #判断平局
  52.             elif person_x== computer_x:
  53.                 print("第{0}局 >>>>>>>>>>>>{1}>{2} :平局".format(num,self.boxing_obtain(person_x),self.boxing_obtain(computer_x)))
  54.                 print()
  55.                 even+=1
  56.             #判断电脑输
  57.             else:
  58.                 print("第{0}局 >>>>>>>>>>>>{1}>{2} :输".format(num,self.boxing_obtain(person_x),self.boxing_obtain(computer_x)))
  59.                 print()
  60.                 computer_num += 1
  61.             yn = input("游戏是否继续:(y继续,n结束)")
  62.             print()
  63.             if yn=="y":
  64.                 continue
  65.             else:
  66.                 print("*"*30)
  67.                 print("猜拳结束:\n{0}赢{1}局\n电脑输{2}局\n平局{3}次".format(role_name,person_num,computer_num,even))
  68.                 print("*" * 30)
  69.                 break
  70. if __name__ == '__main__':
  71.     g = Guess()
  72.     g.role()<br>执行结果:<br><img src="https://img2023.cnblogs.com/blog/1375875/202212/1375875-20221219013333922-959550540.png" alt="" width="774" height="562" loading="lazy">
复制代码
 
  1. <br><br><br>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表