首先什么是对象?
其实这也是面试过程中经常会被问到的问题,当然在最开始,我们了解还不是那么多,那么深刻,那该怎么说呢,我们由简入深,其实世间的万事万物都是对象,比如说一个学生,就是一个对象,那么我们肯定会想到学生首先是一个人,那么他就有鼻子,耳朵,嘴巴,这些从属于他本身的,我们把这个叫做他的属性,然后学生肯定拥有听课的动作,我们把对象拥有的动作称为他的方法;那么针对对象,他其实就是集属性和方法为一身的独立个体;
在python的世界里面,才是真的万事万物都是对象,说白了就是不管你是否有属性和方法,我们都可以把他看成是一个独立的个体即对象,所以python是一门oop语言,oop就是面向对象编程的简写,所以python是一门面向对象编程的语言;
那么面向对象编程又是什么呢?
其实我们从字面意思去理解就很好理解了,举个例子,比如说我们需要写一个程序,这个程序有一个功能就是盖一座大楼,那么这个时候我们的注意点就要想清楚了,你只需要每步都想着用一个对象帮你完成,不管什么步骤你都是用对象去帮你,而不是说需要你亲自动手,那你的工作其实就是面向对象工作,而不是面向砖,水泥工作,我们可以再说具体一点,盖大楼,首先需要原材料吧,其实这种时候我们的注意点并不是砖,水泥这些原材料,而是说你需要一个采购员,这个采购员就是一个对象,其实具体需要什么材料,不用你关心,你的采购员会帮你完成,然后就是修建过程了,这个时候呢,你也不需要知道具体的修建方法,你只需要泥瓦匠,你的泥瓦匠会帮你完成,你在回头看看你自己,你是不是惊奇的发现,你已经是面向对象了,而不是面向砖瓦,所以我们在写程序的时候,总会新建多个对象,然后总是去调用对象,但是对象自身到底是怎么实现的,我们并不关心,这就是面向对象编码;
那我们应该怎么从面向过程往面向对象转变呢,其实我们之前写代码,分解步骤的过程就是面向过程,其实最开始的步骤还是不变,还是先分解步骤,然后把步骤重新在封装一下,就是把类式步骤,或者一类步骤,我们把他抽出来,抽成一个个对象,封装成一个类,一个类就拥有这些功能,我们在写功能最终就成了调用类,类其实就是对象,那就是调用对象,这样我们就是面向对象编程了,其实面向对象编程就是对面向过程编程的封装;
类是什么?
我们还是从生活中去想想看,是不是有人类,鸟类,哺乳类,等各种类啊,其实类就是对对象的抽象,比如说最开始的时候,是没有鸟类这个概念的,有一天,有一个人,看见一种东西,这种东西有黄色的羽毛,有黑色的爪子,还有五颜六色的翅膀,还能飞,也能行走,那第一次看见这种东西的人不认识这种东西啊,于是他就记录下来以后就叫斑鸠,然后他又看见了其他五十种有羽毛,有爪子,有翅膀,能飞,能行走的东西,并都命了名,有一天突然看见了有鳞,没有脚,能爬的东西,命名为蛇,然后又看见了六十种有鳞。没有脚,能爬的东西也命了名,但是他发现不好管理这么多东西了,东西太多,不好区分,于是乎他就把有鳞,没有脚,能爬的东西统称为爬行动物,有羽毛,有爪子,有翅膀,能飞,能行走的统称为鸟类,这其实就是类的产生,以后看到喜鹊,就可以叫做这个是喜鹊,它属于鸟类,我们也可以发现,喜鹊是一个独立的个体,其实就是一个对象;总结:对对象进行抽象便形成了类,而对类进行实例到个体,其实就是确确实实的对象;我们在补充一点,就是静态的东西,比如说翅膀,爪子等这种我们叫做类的属性,,然后飞,行走等动态的我们叫做类的方法;
在python种的实践:
类的基本定义:我们可以看到,类是有一个关键字class修饰,然后紧跟着类名,需要注意的是类的首字母大写,后面一个冒号,下面就是代码块;
class Person:
pass
实例化对象:我们可以看到通过类名加上小括号就实例出一个对象,比如说人类,通过人类我们得到一个具体的对象张三,然后有两点注意的,类有一个属性是类名,Person也是一个变量,指向类的地址,对象有一个属性class,也就是我们通过张三知道张三是人类,不是动物类,
person=Person()
print(Person.__name__)
print(person.__class__)
属性:分为对象属性和类属性,我们先看看对象属性
A:对象属性,首先属性是属于对象的,那么我们肯定要用对象才能引用出来,也就是说它的宿主是对象,
A_1:对象属性的增加,我们可以直接通过对象.属性=某个值,来增加;在内存的表现形式就是开开辟一个空间存放18,然后在person对象增加一个属性,这个属性指向18的内存地址;
person.age=18
A_2:对象属性的查询操作,也很简单,直接用对象.属性即可查询,或者用__dict__,查询所有的属性
print(person.age)
print(person.__dict__)
A_3:对象属性的修改操作,其实也是用对象.属性=某个值来进行修改,这里我们应该注意的是,同样是对象.属性=某个值,当属性没有的时候就是新增,当属性存在的时候就是修改:总之只要是用=都表示是给属性变量重新赋的一个地址,只有当值是可变类型的时候,我们通过改可变类型的值达到的修改操作,才不是重新赋地址;
person.age=18
print(person.age)
person.age=19
print(person.age)
=====================
person.items=['书','桌子','椅子']
print(person.items,id(person.items))
person.items.append('电脑')
print(person.items,id(person.items))
A_4:对象的删除操作,用del语句删除;这种时候,属性被删除了,右边的值的地址如果没有被其他引用,那么值的地址也会被删除;
del person.items
对象属性的注意事项,由一个类产生的不同对象,都是不同的独立的个体,也就是说不同对象之间的属性是不能互相访问的;
类属性:类属性就是表示这个属性是从属于类的,他的宿主是类,其实在python世界里,是万物皆对象,所以其实类也是对象,那我们说根据类产生的对象,其实是特指;
B_1类属性的增加:由于类本身也是对象,所以我们也可以直接用类.属性=某个值,为类增加对象:其实我们在日常编码中并不常用这种方式给类增加对象,而是采用的另一种方式,见下划线以下代码:用第二种方式为类增加属性,更加方便,也更直观;
Person.number=18
print(Person.number)
print(Person.__dict__)
==================================
class Person:
num=20
age=18
eye=2
print(Person.age)
print(Person.__dict__)
B_2类属性的查询:第一种方式,由于类也是类对象,所以我们当然可以用类.属性去查询类属性;第二种方式也可以用类产生的对象去获取类的属性,也就是我们特指的对象。当用类产生的对象去查询属性时,对象会首先看自己有没有这个属性,当自己没有这个属性的时候,那么这个对象会根据__class__所指向的类,再去查询类的属性:从下面的代码可以看出p.__class__.age就是Person类的属性,而p.age就是p对象的属性,当p对象没有age属性的时候,就会查询__class__类的属性;
print(Person.age)
print(Person.__dict__)
==========================
class Person:
age=18
p=Person()
p.age=99
print(p.__class__.age)
print(p.age)
B_类属性的修改:我们当然可以通过类.属性=某个值去修改类属性,那我们可以使用对象.属性=某个值去修改类属性吗?,答案肯定是不行的,因为我们在之前就讲过用对象.属性=某个值,就是操作的对象的属性,没有即新增,有即修改,都是针对对象的,当我们使用对象.属性=某个值的时候,就可能为对象新增了某个属性,达不到修改类属性的要求:但是我们也可以通过对象__class__找到类,然后修改类对象属性;
Person.age=19
print(Person.age)
p.__class__.age=20
print(Person.age)
B_类属性的删除:通过del语句来删除类属性:
del Person.age
类属性总结:通过上面我们可以看出,只有查询操作的时候,我们才可以使用对象来查询类属性,其他的增,删,改都只能通过类本身来操作;
注意:1.一般情况下,属性都是存储在__dict__字典属性中的,一般对象可以直接修改__dict__属性,但是类对象的__dict__属性不能直接被修改,因为类对象有很多内置属性,防止内置属性被修改引起错误,但是可以通过其他方式修改;2.类属性被各个对象所共享,因为只要你是由同一个类产生的,那么你的根肯定都是同一个,你们同时访问类属性的时候,必然是同一个类属性;
p1=Person()
p2=Person()
print(p1.age,p2.age)
补充:我们如果用以上的方法去创建对象,其实各个对象是可以无节制的拥有各种属性,差异如果巨大的话,我们有可能都会怀疑是不是属于同一个类,就比如一个黄种人生了两个孩子,一个是白种人,一个是黑种人,那肯定会流言四起吧,所以我们还可以利用类的一个属性__slots__来限制通过这个类产生的对象的属性,这个属性的接收值是一个列表,列表里面就放通过这个类产生对象的可以拥有的属性,如果对对象新增的属性不属__slots__就会报错,这样就能起到一个限制对象属性的作用:
class Person:
__slots__ = ['age','num']
p1=Person()
p2=Person()
p1.age=8
p2.num=9
print(p1.age,p2.num)
网友评论