类/属性/方法
1. 面向对象
面向过程:
变量和函数。“散落”在文件的各个位置,甚至是不同的文件中。
看不出来变量与函数的相关性,非常不利于维护,设计模式不清楚。
经常导致程序员,忘记某个变量的相关性,而导致无法检测的错误。
面向对象:
相关的变量和函数都“封装”在对象里,以对象为基本单位来管理代码。
变量与函数的相关性清晰,利于维护,设计模式清晰。
程序员可以配合“继承”来提高代码的可重用性,加强合作开发。
名次:类/实例 属性/方法 解析查找顺序 封装/继承/鸭子类型 特殊属性/特殊方法
2. “类”与“实例”
类:是一类事物的抽象,不是真实存在的。描绘了该类事物的共性。例如:“人”,“动物”,“家具”
实例:某类事物的具体个体,是该类事物的具体表现,他是真实存在的。
例如:“Tuple”是具体的某个“人”
“加菲猫”是具体的某个“动物”
创建“类”与“实例”
#创建"类" class Person: pass #创建"实例" # 类似于函数调用,返回一个具体的"实例" p=Person()
isinstance判别函数(当你不确定一个变量是什么类的实例时候)
使用方法:
isinstance(对象,类)
判断“对象”,是不是“类”的实例
isinstance(对象,类的元组)
判断“对象”,是不是“类的元组”中的某一个”类“的实例
class Person: pass class Animal: pass p1=Person() #实例出第一个具体的人 p2=Person() #实例出第二个具体的人 a=Animal() #实例出一个具体的动物 print(p1 is p2) # False, 同一个类,可以对应许多不同的实例 print(isinstance(p1,Person)) #True print(isinstance(a,Animal)) #True print(isinstance(p1,Animal)) #False print(isinstance(p1,(Person,Animal))) #True,判断属不属于某一类
3. 属性封装
类就是一个独立存放变量的空间
属性查找
运算符“.”
用于进行变量空间的运算。
class Person: var1="直接封装在类中的变量" print(Person.var1) Person.var2='后来封装在类中的变量' print(Person.var2) #使用类调用 p=Person() #实例化 print(p.var1) #使用类调用,实例中看到类中封装的变量 print(p.var2)
实例也是一个独立存放变量的空间
每个实例都是一个独立的变量空间,不同实例之间的空间互相不可见。
class Person: pass p1=Person() #实例出第一个具体的人 p2=Person() #实例出第二个具体的人 p1.var= "在实例中封装的变量" print(p1.var) print(Person.var) #AttributeError 类中找不到,不会去找实例中的属性 print(p2.var) #p2中没有,去找Person,也没有
一个“实例”的“特征”,就是“属性”
class Person: pass p1=Person() #实例出第一个具体的人 p2=Person() #实例出第二个具体的人 p1.name="Tuple" #名字就是区别别人的某一个特征 p2.name="Budong"
4. 方法
实例方法
“实例方法”就是封装在类里的一种特殊的函数
“实例方法”表示的是“实例”的行为
class Person: def eat(self): print('{name} eating ...' .format(name=self.name)) p1=Person() p1.name="Tuple" p2=Person() p2.name="Lucky" p1.eat() #Person.eat(p1) p2.eat() #Person.eat(p2)
这样,就将name变量与eat函数,这两个相关对象,通过封装,深度的绑定在了类与实例中
“实例方法”的调用过程与self
通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身。
方法总是定义在类中的,但是却叫“实例方法”,因为它表示该类所有实例所共有的行为。
面向对象的总结
知识点一:所谓面向对象,就是从事物的内部联系与事物与事物间的外部联系来考虑我们的代码设计的。
知识点二:类与实例,是现实对象在代码中的体现。他们也提供了专门的变量空间。
知识点三:属性表示的实例的特征,通常标识了一个实例。因此,通常存在于实例中。
知识点四:实例方法是一个类中所有实例公共的行为。因此通常不会每个实例里存放一个,而是存放于类中。