面向对象帮我们解决什么问题?
面向对象的风封装的这个特性帮助我们解决了两个问题 1.归类: 将方法和静态变量放置到一个类中 2.打包: 将数据打包到一个对象
面向对象的三大特性
封装,继承,多态 1.封装: 帮我们解决一些方法和属性进行分类,让代码更加的清晰,提高可读性提高 2.继承: 提高代码的复用性,将具有相同的属性和方法提取出来 3,多态: python原生支持多态,崇尚鸭子模型,由于python函数传参时,无需指定参数类型
对于对象(self)的跟踪:
self参数是这实例化的过程中帮助我们自动传递的.所以在继承中是,对于结果的输出时.要看self是谁的对象空间,这会才能确定输出的结果是谁
在python中支持多继承,这会对抽象类和接口类的使用会提供很大的帮助
类中的成员
分成三类:
1.变量:
1.实例变量(又可以说是字段):1),公有实例变量2),私有实例变量
实例一: class Foo: # 类变量(静态字段) country = "中国" def __init__(self,name): # 实例变量(字段) self.name = name def func(self): pass obj1 = Foo('阿童木') obj2 = Foo('葫芦娃') Foo.country
2.类变量: 1),公有类变量2),私有类变量
无法访问: class Base(object): __secret = "受贿" class Foo(Base): def func(self): print(self.__secret) print(Foo.__secret) obj = Foo() obj.func() 可以访问: class Base(object): __secret = "受贿" def zt(self): print(Base.__secret) class Foo(Base): def func(self): print(self.__secret) print(Foo.__secret) obj = Foo() obj.zt()
2.方法:
实例方法
class Foo(object): def __init__(self, name): self.name = name # 实例方法 def func(self): print(self.name) obj = Foo('..') obj.func()
静态方法
class Foo(object): def __init__(self, name): self.name = name # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法 @staticmethod def display(a1,a2): return a1 + a2 Foo.display(1,3)
类方法
class Foo(object): # 类方法,cls是类 @classmethod def show(cls,x1,x2): print(cls,x1,x2) # 执行类方法 Foo.show(1,8)
3.属性(通过方法改造出来):
class Foo(object): def __init__(self): pass @property def start(self): return 1 @property def end(self): return 10 obj = Foo() print(obj.start) print(obj.end)
总结:
1.编写时:
方法上方写@property
方法参数:只有一个self
2.调用时: 无需加括号 对象.方法
3.应用场景:对于简单的方法,当无需传参且有返回值时,可以使用@property
嵌套:
面向对象:
""" 创建三个学校且三个学校的设施内容等都是一致. """ class School(object): def __init__(self, name, address): self.name = name self.address = address def speech(self): print('讲课') obj1 = School('老男孩北京校区', '美丽富饶的沙河') obj2 = School('老男孩上海校区', '浦东新区') obj3 = School('老男孩深圳校区', '南山区') class Teacher(object): def __init__(self, name, age, salary): self.name = name self.age = age self.__salary = salary self.school = None t1 = Teacher('李杰', 19, 188888) t2 = Teacher('艳涛', 18, 60) t3 = Teacher('女神',16, 900000) # ############## 老师分配校区 t1.school = obj1 t2.school = obj1 t3.school = obj2 # #################################### # 查看t1老师,所在的校区名称/地址 print(t1.school.name) print(t1.school.address) print(t1.name) print(t1.age) t1.school.speech() 准则:字段和方法的归类