类与对象

类有两种属性:数据属性和函数属性
1,类的数据属性是所有对象共享的
print(id(OldboyStudent.school))
print(id(s1.school)
print(id(s2.school))

类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
print(people.run)
2,类的函数属性是绑定给对象用的
#一、类的实例化:调用类产生对象的过程称为类的实例化,实例化的结果是一个对象,或称为一个实例
class People:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def run(self):
        print('%s is running' %self.name)

#实例化做了三件事
#1、先产生一个空对象
#2、自动触发类内部__init__函数的执行
#3、将空对象,以及调用类括号内传入的参数,一同传给__init__,为对象定制独有的属性
# obj=People('egon',18,'male') #People.__init__(obj,'egon',18,'male')

# 会产生对象的名称空间,如何查看
# print(obj.__dict__)

#二;对象的操作
# print(obj.name) #obj.__dict__
# obj.education='哈佛'
# del obj.name
# obj.age=19
# print(obj.__dict__)


#三:对象属性的查找顺序:先找对象自己的名称空间----》类的名称空间
class People:
    x=1
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def run(self): #self=obj
        print('%s is running' %self.name) #obj.name

obj=People('egon',18,'male') #People.__init__(obj,'egon',18,'male')
obj1=People('egon1',18,'male') #People.__init__(obj,'egon',18,'male')
obj2=People('egon2',18,'male') #People.__init__(obj,'egon',18,'male')

#1、类的数据属性:是给对象用的,而且直接共享给所有对象用的,内存地址都一样
# print(People.x)
# People.x=11111

# print(id(People.x),People.x)
# obj.x='obj================》'
# print(id(obj.x),obj.x)
# print(id(obj1.x),obj1.x)
# print(id(obj2.x),obj2.x)


#2、类的函数属性:也是给对象用,但是绑定给对象用的,绑定到不同的对象就是不同的
#绑定方法,内存地址都不一样,但其实只想都是同一个功能
# print(People.run) #<function People.run at 0x00000226E7C78A60>
# People.run(123123)
# People.run(obj)

# print(obj.run)
# print(obj1.run)
# print(obj2.run)

# # 实例化一个对象 obj

# obj = People('fixd',18,'male')

#

#

# print(obj.name) #查看 属性name的值

# obj.education='哈佛' # 添加属性

# del obj.name # 删除属性

# obj.age=19 # 修改属性值

# print(obj.__dict__) # 查看实例化对象的名称

 

#四:绑定方法的特殊之处:
#1、 绑定给谁就应该由谁来调用,
#2、谁来调用就会把谁当做第一个参数传入
class People:
    x=1
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def run(self): #self=obj
        print('%s is running' %self.name) #obj.name

    def f1():
        print('from f1')

    def f2(self):
        pass

obj=People('egon',18,'male') #People.__init__(obj,'egon',18,'male')
# obj1=People('egon1',18,'male') #People.__init__(obj,'egon',18,'male')
# obj2=People('egon2',18,'male') #People.__init__(obj,'egon',18,'male')
#
 obj.run()
 obj1.run()
 obj2.run()

 print(People.f1)
 People.f1()
 print(obj.f1)
 obj.f1() #People.f1(obj)


五:一切皆对象:在python3中统一了类与类型的概念,类即类型
l=list([1,2,3])
 print(type(l))

 print(type(obj))

练习人狗大战
class People:
    def __init__(self,name,aggresivity,life_value=100):
        self.name=name
        self.aggresivity=aggresivity
        self.life_value=life_value
    def bite(self,enemy):
        enemy.life_value-=self.aggresivity
        print('''
        人[%s] 咬了狗一口[%s]
        狗掉血[%s]
        狗还剩血量[%s]
        ''' %(self.name,enemy.name,self.aggresivity,enemy.life_value)
              )
class Dog:
    def __init__(self,name,dog_type,aggresivity,lise_value):
        self.name=name
        self.dog_type=dog_type
        self.aggresivty=aggresivity
        self.life_value=lise_value
    def bite(self,enemy):
        enemy.life_value-=self.aggresivty
        print('''
        狗[%s]咬了人一口[%s]
        人掉血[%s]
        人还剩血量[%s]
        ''' %(self.name,enemy.name,self.aggresivty,enemy.life_value)
              )

p1=People('LXX',60)
d1=Dog('liji',"占鳌",200,200)

p1.bite(d1)
#d1.bite(p1)

posted @ 2018-04-11 23:32  嘿,  阅读(170)  评论(0编辑  收藏  举报