类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例)
对象:一个具体的事物(事物即数据和动作的结合体)
类和对象的关系:对象是由类产生的,类相当于模板(实际上实例就是调用了类中__init__方法产生的,只有数据属性)
实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫一个实例(实例 = 对象)
面向对象设计:将一类具体事物的数据和动作整合在一起,即面向对象设计
面向对象编程:用定义类+实例/对象的方式去实现面向对象的设计
注意:用面向对象语言写程序,和一个程序的设计是面向对象的,两者是不同的。面向过程语言 用 函数 也可以实现面向对象。
特殊的类属性
class Student(object):
‘好好学习,天天向上’
name = 'aaa'
def study(self):
pass
print(dir(Student)) #返回列表,查看类所有 **属性名**(包括内建属性名)
print(Student.__dict__) #返回字典,查看类的 **属性字典**
Student.study() #本质是查属性字典 Student.__dict__['study']
print(Student.__name__) #类的名字(字符串)
print(Student.__doc__) #类的文档字符串(好好学习,天天向上)
print(Student.__base__) #类的第一个父类
print(Student.__bases__) #类的所有父类构成的元组
print(Student.__dict__) #类的属性字典
print(Student.__module__) #类定义所在的模块
print(Student.__class__) #实例所对应的类
对象调用属性时先查看对象属性字典(只包括__init__中的数据属性),之后查看类属性字典,都找不到就会报错
为什么对象可以调用类中函数属性? 实例的作用域是类中的 __init__函数,在该函数中找不到就到上一层(类)中去找。(无函数作用域概念,自己懂就好,切勿面试)
类的增删改查
#增加
Student.country = 'China' #增加数据属性
def test(self):
print('这是类生成的函数属性')
Student.test = test #增加函数属性
#修改
Student.study = test #修改函数属性
Student.country = 'haha' #修改数据属性
#删除
del Student.country
实例增删改查差不多,不过实例一般不进行函数属性的增加(保证实例只有数据属性,函数引用类中的即可),增加之后不符合类的结构,系统不会自动调用self
count = 'bbb'
class Student(object):
# '好好学习,天天向上'
count = 'aaa'
def __init__(self,name):
self.name = name
print('---->',count)
def study(self):
print('%s 爱学习'%self.name)
print(Student.count)
s1 = Student('alex')
print(s1.count)
s1.study() # 不用传第一个参数,python会自动将 s1传过去相当于--->s1.study(s1)
#结果
aaa
----> bbb
aaa
注意:只有通过点 . 调用实例属性或者类属性时才会找类中的属性;没有点 . 就不会在类中查找