python 类与对象
_init_方法详解
#方式一:为对象初始化自己独有的特征 class People: country='China' x=1 def run(self): print('----->', self) # 实例化出三个空对象 objone=People() objtwo=People() objthree=People() # 为对象定制自己独有的特征 objone.name='tom' objone.age=18 objone.sex='male' objtwo.name='jack' objtwo.age=22 objtwo.sex='female' objthree.name='rusa' objthree.age=26 objthree.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 = z fuzhi(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)) ''' 4377347328 4377347328 4377347328 4377347328 ''' #类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样 print(Colleges.learn) print(s1.learn) print(s2.learn) print(s3.learn) ''' <function Colleges.learn at 0x1021329d8> <bound method Colleges.learn of <__main__.Colleges object at 0x1021466d8>> <bound method Colleges.learn of <__main__.Colleges object at 0x102146710>> <bound method Colleges.learn of <__main__.Colleges object at 0x102146748>>
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)