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)

 

posted @ 2019-01-14 20:45  Coolc  阅读(192)  评论(0编辑  收藏  举报