11 Apr 18 类与对象 对象的使用 一切皆对象

11 Apr 18
一、类与对象
类的定义
class OldboyStudent:
    # 用变量表示特征
    school="Oldboy"
 
    def __init__(self,name,age,sex): #self=stu1     name= "马冬梅"   age=18     sex="female"
        self.name=name # stu1.name = "马冬梅"
        self.age=age  # stu1.age = 18
        self.sex=sex  # stu1.sex = "female"
 
    #  用函数表示技能
    def learn(self):
        print('is learning...',self)
 
    def choose(self):
        print('choose course...')
 
stu1=OldboyStudent()
stu1.NAME='马冬梅'
stu1.AGE=18
stu1.SEX="female"
 
print(stu1.NAME,stu1.school)
#以上方法是在产生对象之后方能为对象增加属性,而实际情况更多的是希望在产生对象的过程中为对象增加属性
 
调用类发生哪些事:
1、首先会产生一个空对象stu1
2、会自动触发类内部的__init__函数
3、然后将空对象stu1连同调用类时括号内的参数组成(stu1,"马冬梅",18,'female'),将这四个参数一起传给__init__函数
 
stu1=OldboyStudent("马冬梅",18,'female')  #OldboyStudent.__init__(stu1,"马冬梅",18,'female')
stu2=OldboyStudent("甜蜜蜜",21,'male') #OldboyStudent.__init__(stu2,"甜蜜蜜",21,'male')
stu3=OldboyStudent("原石开",22,'male')
 
print(stu1.name,stu1.age,stu1.sex)
# .左边一定是一个名称空间。.右边是属性
 
二、对象的使用
school='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
class OldboyStudent:
    school='oldboy'
 
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
 
    def learn(self):
        print('%s is learning' %self.name)
 
    def choose(self,course):
        print('%s is choosing %s' %(self.name,course))
 
调用类---》产生类的对象,该对象也可以称为类的一个实例,调用类的过程也称为类的实例化
stu1=OldboyStudent('李三胖',18,'male') #OldboyStudent.__init__(stu1,'李三胖',18,'male')
stu2=OldboyStudent('王大炮',28,'male')
 
先在对象的名称空间中查找,若查不到接着去类的名称空间中查找,若依然查不到则报错,不会去全局名称空间中查找。
print(stu1.school)  #但前缀,只在对象及类的名称空间查找
print(school)  #不带前缀,查的是全局名称空间中的名字
 
类内部定义的变量是给所有对象共享,所有对象指向的都是同一个内存地址
print(id(stu1.school))
print(id(stu2.school))
print(id(OldboyStudent.school))   #以上三者的id一致
 
类内部定义的函数,类可以使用,但类来用的时候就是一个普通函数,普通函数有几个参就传几个参数
print(OldboyStudent.learn)
OldboyStudent.learn(123)
 
类内部定义的函数,其实是给对象使用的,而且是绑定给对象用,绑定给不同的对象就是不同的绑定方法(bound method)
print(stu1.learn)
print(stu2.learn)
绑定方法的特殊之处在于,谁来调用,就会将谁当作第一个参数自动传入
 
三、一切皆对象
class OldboyStudent:
    school='oldboy'
 
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
 
    def learn(self):
        print('%s is learning' %self.name)
 
    def choose(self,course):
        print('%s is choosing %s' %(self.name,course))
 
stu2=OldboyStudent('王大炮',28,'male')
 
print(id(stu2))
print(type(stu2)) # 类与类型是一个概念(在python3中,统一了类与类型的概念)
 
l1=[1,2,3] #l1=list([1,2,3])
print(type(l1))  # class list
l1.append(4) #list.append(l1,4)
print(l1)
 
l2=['a','b','c']
l2.append('d') # list.append('d')
print(l2)
 
print(int)
print(str)
print(dict)
print(tuple)
print(set)
print(OldboyStudent)
 
四、小练习
class Foo:
    n=0
    def __init__(self):
        Foo.n+=1 # Foo.n=3   #必须用Foo,否则不共享
 
增删改查
class Bar:
    n=1111111111
    def __init__(self,x):
        self.x=x
 
obj=Bar(111)
print(obj.__dict__)
print(obj.n)
obj.y=2
obj.n=3
print(obj.__dict__)
print(obj.n)
obj.x=123
del obj.x
print(obj.x)
 
人狗大战
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): #self=p1   enemy=d1
        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, life_value):
        self.name = name
        self.dog_type = dog_type
        self.aggresivity = aggresivity
        self.life_value = life_value
 
    def bite(self, enemy): #self = d1    enemy= p1
        enemy.life_value-=self.aggresivity
        print("""
        狗[%s] 咬了一口人 [%s]
        人掉血[%s]
        人还剩血量[%s]
        """ %(self.name,enemy.name,self.aggresivity,enemy.life_value)
        )
 
p1 = People('刘清政', 60)
d1=Dog('李杰',"藏獒",200,200)
 
p1.bite(d1)
d1.bite(p1)
 
总结:
一、类的实例化:调用类产生对象的过程称为类的实例化,实例化的结果是一个对象,或称为一个实例
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)
 
四:绑定方法的特殊之处:
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))
l.append(4)
原文地址:https://www.cnblogs.com/zhangyaqian/p/py20180411.html