Fork me on GitHub

面向对象

一  类

 1类的定义:

我们知道在面向对象编程中,类是我们虚拟出来的用来表示一系列对象特征与功能的结合体。

 2类的实例化:

我们通过调用类产生对象的过程称为类的实例化,实例化的结果就是一个对象,或者叫一个实例。

我们先定义一个类:
class Poeple:
    def __init__(self,name,age,sex):
        self.name=name    #self在这里就相当于一个空的对象,我们在产生对象的时候对空对象进行特殊化处理,
        也就是说如果我们不进行特殊化那么产生的所有对象都是一样的。
        self.age=age
        self.sex=sex

    def run(self):
        print('%s is running ..'%self.name)#这里的self.name就相当于我们下面的obj1.name
print(Poeple.__dict__)
obj=Poeple('egon',18,'male')#我们通过调用Poeple自动触发类内的__init__函数进行,将传入的值赋给对象obj1,
那么其实Poeple中需要传入四个值,而这里将产生的第一个空对象也就是obj1传给了self。
就相当于:Poeple.__init__(obj,'egon',18,'male')===〉〉obj=Poeple('egon',18,'male')
print(obj.name)
print(obj.age)
print(obj.sex)
print(obj)#输出为obj这个对象所在的内存地址。
在实例化的过程中,具体发生了三件事:
1首先产生一个空对象,
2自动触发类内部的——init——函数的执行
3然后将空对象stu1连同调用类时括号内传入的参数组成(stu1,name,age,sex)将这四个参数一起传给——init——函数。

3对象的操作:增,删,改,查。
那么先说增:
obj.hobby='play'
print(obj.__dict__)
删
del obj.hobby
print(obj.__dict__)
改
obj.name='alex'
print(obj.__dict__)
查
print(obj.name)
同样的也可以:
print(obj.__dict__['name'])
print(obj.age)
print(obj.sex)

 

4 对象属性的查找顺序:
4.1 先找对象自己所在的名称空间,然后在去到类的名称空间去找,
这里需要强调一点就是,类的名称空间与对象的名称空间没有包含关系,是相互独立的。
print(obj)
print(Poeple('egon',18,'male'))
class Poeple:
    x=3
    def __init__(self,name,age,sex,):
        self.name=name
        self.age=age
        self.sex=sex
obj=Poeple('alex',73,'female')
obj2=Poeple('alex1',34,'male')
obj3=Poeple('alex2',45,'male')

print(obj.x,id(obj.x))  #3 1648193056
obj.x=2222222222    #在这改变x的值,并不会改变最后输出的值。

print(obj3.x,id(obj3.x))      #3 1648193056
print(obj2.x)     #3
Poeple.x=333333333   #我们可以通过类Poeple来改变
print(obj3.x,id(obj3.x))      #333333333   98717568816
print(obj2.x)     #3333333333333
# 
由此可以得出类的数据类型是给对象用的,而且直接共享给所有的对象用,
我们可以看出所有的对象都指向同一个地址。
5

 

4.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

print(People.run) #<function People.run at 0x00000226E7C78A60>
People.run(123123)
People.run(obj)
obj=People('egon',16,'female')
obj1=People('alex',16,'female')
obj2=People('zhang',16,'male')
print(obj.run)##<bound method People.run of <__main__.People object at 0x000000C591EF7A58>>
print(obj1.run)##0x000000C591EF7A90
print(obj2.run)##0x000000C591EF7AC8

 

四:绑定方法的特殊之处:
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)#这里当我们通过对象来调用类中的函数f1(),会向f1()传参数,
但是f1被我们定义成无参函数。
 
五 一切皆对象
l1=[1,2,3,4,4]
print(l1,type(l1))####[1, 2, 3, 4, 4] <class 'list'>
 l1.append('x')

 print(l1)
 print(l1,list.append(l1,'x'))
 我们可以看出来其实l1.append(‘a’)与list.append(l1,‘a’)结果是一样的。
 在python3中类就是类型。那么我们之前学过的list,tuple等都是类。

 







#

 

posted @ 2018-04-11 17:51  道阻切长  阅读(205)  评论(3编辑  收藏  举报