_init_方法详解
#方式一:为对象初始化自己独有的特征class People: country='China' x=1 def run(self): print('----->', self)# 实例化出三个空对象objone=People()objtwo=People()objthree=People()# 为对象定制自己独有的特征objone.name='tom'objone.age=18objone.sex='male'objtwo.name='jack'objtwo.age=22objtwo.sex='female'objthree.name='rusa'objthree.age=26objthree.sex='female'print(objone.__dict__)print(objtwo.__dict__)print(objthree.__dict__)print(People.__dict__)#方式二、为对象初始化自己独有的特征class People: country='China' x=1 def run(self): print('----->', self)# 实例化出三个空对象objone=People()objtwo=People()objthree=People()# 为对象定制自己独有的特征def fuzhi(obj, x, y, z): obj.name = x obj.age = y obj.sex = zfuzhi(objone,'tom',18,'male')fuzhi(objtwo,'jack',22,'female')fuzhi(objthree,'rusa',26,'female')#方式三、为对象初始化自己独有的特征class People: country='China' x=1 def fuzhi(obj, x, y, z): obj.name = x obj.age = y obj.sex = z def run(self): print('----->', self)objone=People()People.fuzhi(objone,'tom',18,'male')objtwo=People()People.fuzhi(objtwo,'jack',22,'female')objthree=People()People.fuzhi(objthree,'rusa',26,'female')# 方式四、为对象初始化自己独有的特征class People: country='China' x=1 def __init__(obj, x, y, z): obj.name = x obj.age = y obj.sex = z def run(self): print('----->', self)objone=People('egon',18,'male') #People.__init__(objone,'tom',18,'male')objtwo=People('lxx',38,'female') #People.__init__(objtwo,'jack',22,'female')objthree=People('alex',38,'female') #People.__init__(objthree,'rusa',26,'femal
ps:__init__方法内可以有任意的python代码,但是一定不能有返回值。
类的特殊属性
- 类名.__name__# 类的名字(字符串)
- 类名.__doc__# 类的文档字符串
- 类名.__base__# 类的第一个父类(在讲继承时会讲)
- 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
- 类名.__dict__# 类的字典属性
- 类名.__module__# 类定义所在的模块
- 类名.__class__# 实例对应的类(仅新式类中)
属性查找
类有两种属性:数据属性和函数属性
- 类的数据属性是所有对象共享的
- 类的函数属性是绑定给对象用的
#类的数据属性是所有对象共享的,id一样print(id(Colleges.school))print(id(s1.school))print(id(s2.school))print(id(s3.school))'''4377347328437734732843773473284377347328'''#类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样print(Colleges.learn)print(s1.learn)print(s2.learn)print(s3.learn)'''> > >
obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到则抛出异常
绑定到对象的方法特殊之处
- 类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
- 类中定义的函数(没有被任何装饰器装饰的)是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法
- 绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)
ps:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self
对象交互
class Garen: #定义英雄盖伦的类,不同的玩家可以用它实例出自己英雄; camp='Demacia' #所有玩家的英雄(盖伦)的阵营都是Demacia; def __init__(self,nickname,aggressivity=58,life_value=455): #英雄的初始攻击力58...; self.nickname=nickname #为自己的盖伦起个别名; self.aggressivity=aggressivity #英雄都有自己的攻击力; self.life_value=life_value #英雄都有自己的生命值; def attack(self,enemy): #普通攻击技能,enemy是敌人; enemy.life_value-=self.aggressivity #根据自己的攻击力,攻击敌人就减掉敌人的生命值 class Riven: camp='Noxus' #所有玩家的英雄(锐雯)的阵营都是Noxus; def __init__(self,nickname,aggressivity=54,life_value=414): #英雄的初始攻击力54; self.nickname=nickname #为自己的锐雯起个别名; self.aggressivity=aggressivity #英雄都有自己的攻击力; self.life_value=life_value #英雄都有自己的生命值; def attack(self,enemy): #普通攻击技能,enemy是敌人; enemy.life_value-=self.aggressivity #根据自己的攻击力,攻击敌人就减掉敌人的生命值 实例化对象 g=Garen('草丛伦')r=Riven('锐雯雯')对象交互r.attack(g)