面向对象
一 类
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等都是类。
#