类与对象
类有两种属性:数据属性和函数属性
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)