类:抽象的 把一类具有共同属性和特征的事物集合到一起就是类
对象:具体的 类里面具体的某一个事物
面向对象设计:就是把一类具体事物的属性和特征集合到一起
面向对象编程:用定义类 + 实例/对象的方法去实现面向对象的设计
初识:
def school(name):
def enrollment(name):
print('%s 正在招生' %name['name'])
school_dic = {'name':name, 'enrollment': enrollment}
return school_dic
s1 = school('xdf')
s1['enrollment'](s1)
进化:
class School: # 用class定义,类名首字母大写
tag = 1
def __init__(self, name): # __init__内置方法,作用是在实例化时,自动生成实例的属性字典并返回,相当于school_dic
self.Name = name # school_dic = {’name‘:name, ’enrollment':enrollment}
# return school_dic
def enrollment(self):
print('%s 正在招生' % self.Name)
s1 = School('xdf') # 实例化,实际就是调用类的init方法 ,生成了一个实例的属性字典 {‘name’:‘xdf}
# 实例只有数据属性,所以实例的属性字典里面只包括了name
s1.enrollment() # s1['enrollent'](s1) 实际是完成了这一步的工作,类会自动将实例本身作为参数传给self
# 虽然实例属性字典里面没有函数属性,但是可以调用类的函数属性enrollment,这是因为作用域的原因,当实例不能从自己的字典中查找到的时候,
#会向上到类的属性字典查找,如果也没有则会报错,不会再向上查找了 当然这种作用域的关系只存在用.的方式调用的时候
self是类帮忙自动传的一个参数,不需要程序员自己去传,实际就是把实例本身作为参数穿过去,也就是实例的属性字典
实例化的过程 ,先找到init方法 生成一个实例的属性字典
总结:类 和 实例都有自己的属性字典,类的属性字典包含了 数据属性和函数属性,实例的字典只有数据属性,这是因为函数属性不是给某一个实例的
如果实例自己有函数属性,这个属性就是一个私有的属性,不能被其他实例调用,
在用 ’.‘的方式 调用实例的属性时,遵循先从自己的字典中找,如果没有就向上到类的属性字典中找,如果也没有就终止,这也就是为什么实例能调用类的方法。
print(School.__dict__) 可以查看类的属性字典,其中就包含了类的数据属性和函数属性
{'__module__': '__main__','tag': 1, '__init__': <function School.__init__ at 0x0000014E1F23D598>, 'enrollment': <function School.enrollment at 0x0000014E1F23D488>, '__dict__': <attribute '__dict__' of 'School' objects>, '__weakref__': <attribute '__weakref__' of 'School' objects>, '__doc__': None}
print(s1.__dict__) 可以查看实例的属性字典,包含了实例的数据属性
{'Name': 'xdf'}