Python 面向对象概念 类和对象 对象初始化__init__ 绑定与非绑定
在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么样的特征和行为,从而根据 这些信息总结出需要的类型
class 类的名称: # 类中的内容 描述属性和技能 #描述属性用变量 #描述行为用函数 #类名称 书写规范 首先是见名知意 名称是大驼峰命名法 #驼峰就是单词首字母大写 , 大驼峰是第一个字母大写,小驼峰是第一个字母小写
2.创建对象语法
class Person: pass #创建对象 p = Person()
3.类中和对象中属性的区别
属性可以写在类中 类中的属性,是所有对象公共的 也可以写在对象中 对象中的属性,是每个对象独特的(不一样的) 如果类中和对象中存在同样的属性,先访问对象 如果没有在访问类 练习: 描述一个老师类 需要包含 一个公共属性和 一个独特的属性 class Teacher: school = "oldboy" t1 = Teacher() t1.name = "jack" t1.age = 28
4.对象属性的 增 删 改 查
1.增加属性 对象变量名称.属性名称 = 属性值 2.删除属性 del 对象的变量名称.属性名称 3.修改 对象.属性 = 新的值 4.查看属性 访问的是对象的所有属性(只能访问到实行的名称空间和类无关) # print(对象.__dict__) class Teacher: school = "oldboy" t1 = Teacher() t1.name = "jack" t1.age = 28 print(t1.__dict__) # {'name': 'jack', 'age': 28} 访问对象的类信息 # print(对象.__class__) print(t1.__class__) # <class '__main__.Teacher'>
class Dog: def __init__(self,kind,color,age): self.kind = kind self.color = color self.age = age print(d1.kind) # 二哈 print(d2.kind) # 泰迪 # 注意:1.当实例化 对象时,会自动执行init方法(注意与元类中__init__区分开来) 2.会自动将对象作为第一个参数传入,参数名称位self ,self可以是别的名字,但不建议改 3.该函数不能有任何返回值/.... 只能是None 规定如此.. 4.有了`__init__`方法,在创建实例的时候,就不能传入空的参数了,必须传入与 `__init__`方法匹配的参数,但`self`不需要传,Python解释器自己会把实例变量传进去:
# 练习:写一个学生类,具备一个打招呼的技能 要能输出自己的名字信息 class Student: def __init__(self,name): self.name = name def say_hi(self): print("hello my name is %s" % self.name) s1 = Student('jack') # 对象调用 s1.say_hi() # hello my name is jack # 类调用 Student.say_hi(s1) # hello my name is jack # 默认情况下类中的方法都是对象绑定方法 # 其特殊之处在于, 当使用对象调用该函数时会自动传入对象本身,作为第一个参数 当使用类名来调用时他就是一个普通函数,有几个参数就得传几个参数
class OldBoyStudent: school = "oldboy" def __init__(self,name): self.name = name @classmethod def show_school(cls): print(cls.school) print(cls) @staticmethod def print_hello(): print("hello world") # 类调用 OldBoyStudent.show_school() # oldboy <class '__main__.OldBoyStudent'> # 对象调用 stu = OldBoyStudent("jack") stu.show_school() # # oldboy <class '__main__.OldBoyStudent'> 类绑定方法用@classmethod来装饰 特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数 什么时候绑定给对象:当函数逻辑需要访问对象中的数据时 什么时候绑定给类:当函数逻辑需要访问类中的数据时
class OldBoyStudent: school = "oldboy" def __init__(self,name): self.name = name @staticmethod def print_hello(): print("hello world") # 对象调用 tu = OldBoyStudent("jack") stu.print_hello(18) # 年龄 18 # 类调用 OldBoyStudent.print_hello(18) # 年龄 18 也叫做静态方法,就是即不需访问类的数据,.也不需要访问对象的数据 语法:@staticmethod 不常用:无论是类调用还是对象调用有几个参数就传几个参数
4.练习
""" 需求设计王者荣耀中的英雄类,每个英雄对象可以对其他英雄对象使用技能 具备以下属性 英雄名称,等级,血量 和Q_hurt,W_hurt,E_hurt 三个属性,表示各技能的伤害量 具备以下技能 Q W E 三个技能都需要一个敌方英雄作为参数,当敌方血量小于等于0时角色死亡 涉及到英雄对象 属性: 名字 等级 血量 行为: Q W E 需要一个英雄类 """ class Hero: def __init__(self,name,level,HP,Q_hurt,W_hurt,E_hurt): self.name = name self.level = level self.HP = HP self.Q_hurt = Q_hurt self.W_hurt = W_hurt self.E_hurt = E_hurt def Q(self,enemy): print("%s 对 %s 释放了 Q技能 造成了%s伤害" % (self.name,enemy.name,self.Q_hurt)) self.attack(enemy, self.Q_hurt) def W(self,enemy): print("%s 对 %s 释放了 W技能 造成了%s伤害" % (self.name, enemy.name, self.W_hurt)) self.attack(enemy, self.W_hurt) def E(self,enemy): print("%s 对 %s 释放了 E技能 造成了%s伤害" % (self.name, enemy.name, self.E_hurt)) self.attack(enemy,self.E_hurt) def attack(self,enemy,hurt): enemy.HP -= hurt if enemy.HP <= 0: print("%s 已被%s击杀" % (enemy.name, self.name)) # 创建两个英雄对象 arso = Hero("亚瑟","15",1000,30,500,200) dj = Hero("妲己","15",800,300,10,800) # # dj.W(arso) # dj.Q(arso) # dj.E(arso) arso.Q(dj) arso.W(dj) arso.E(dj) dj.W(arso) dj.Q(arso) dj.E(arso)
5.补充:
__doc__:注释 对象.__class__:访问对象类信息 类名.__name__:查看类名