#面向对象 #类:模子。Person,不具体。 #实例/对象:依托于类产生的具体的带有属性的。alex #实例化:产生对象的过程。 alex = Person() #类: #分为静态属性(一般的变量)。动态属性(函数) # 查看类中的静态属性:类.变量名 #查看类中的动态属性:类.函数名(或方法名)--->得到的是函数的内存地址。 #调用动态属性:类.函数名() #创建类:class 类名(第一个字母必须大写,后面没有括号): #创建对象: # alex = Person(参数): #内存中开辟一个属于对象的内存空间 # 同时类中会自动执行 def __init__(self):函数 --->外面的参数会通过这里传进来。 #self也会指向刚才对象打开的内存空间,self与alex内存地址相同。 #给__init__(self)传参并定义self的变量值,存在内存地址中,执行结束后将结果返回给对象alex。 #这样对象就产生了,可以用对象查看其中的各种属性或者操作其它类中的方法。 #人狗大战: # class Person: #建立一个类 # def __init__(self,name,sex,hp,ad): #初始化方法 # self.name = name # self.sex = sex # self.hp = hp # self.ad = ad #执行结束将各个变量值传给对象。(因为在同一个内存地址) # def attack(self,dog): #类中的一个方法。可以用对象直接调用,必须用这个类实例化的对象来调用。 # print('%s攻击了%s'%(self.name,dog.name)) # print('%s掉了%s点血,还剩%s点血'%(dog.name,self.ad,dog.hp-self.ad)) # # class Dog: # def __init__(self, name, kind, hp, ad): # self.name = name # self.kind = kind # self.hp = hp # self.ad = ad # def bite(self,person): # print('%s咬了%s'%(self.name,person.name)) # if person.hp <= self.hp: # person.hp = 0 # print('%s血量为0,game over'%person.name) # else: # print('%s掉了%s点血,还剩%s点血' % (person.name, person.ad, person.hp - self.ad)) # # alex = Person('alex','男',50,2) # egon = Person('egon','女',60,5) # taibai = Dog('taibai','taidy',60,90) # # taibai.bite(egon) # alex.attack(taibai) #用对象直接调用类中的方法,省掉再传对象参数给self的麻烦。 #对象调用类中的属性: #类中的属性存在类开辟的内存空间中,其它各个对象会自动产生一个变量指针指向类的内存地址,调用的时候直接根据指针来查找即可。 # class Test: # country = 'china' # lis = ['span'] # # obj = Test() #创建了一个不带参数的对象。 # print(obj.country) #此处便是对象通过指针在类中找到的属性。 # obj.country = 'England' #表示在对象本身的内存空间中增加一个country属性,并不改变类中的属性。 # print(obj.country) # obj.lis = ['Japan'] # obj.lis[0] = 'England' #改变属性时,对象会先在自己的内存空间找是否存在这个属性,如果有,则改变,如果没有则去类中找。 # print(obj.lis) #obj中刚刚创建了lis属性,所以改变的是自己。 # obj.lis[0] = 'England' #如果没有lis这个属性,此处改的便是类中的属性。 # print(obj.lis) # print(Test.lis) #总结:静态属性是所有对象共享的,所以如果要修改静态属性,最好用类直接修改最准确 #类名一般用来:查看或修改静态属性。 # 实例化对象 #对象名一般用来:查看或修改对象的属性 # 调用方法
一、面向对象