python博客是必须写的-3 面向对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python博客是必须写的-3 面向对象相关的知识,希望对你有一定的参考价值。
1.基本概念
·面向对象是一种编程方式,此编程方式是基于"类"和"对象"的使用 ·类:是一个模板,模板中包装了多个"函数"供使用(可以将多个函数共用的变量封装到对象中) ·对象:根据类创建的实例,实例用于调用包装在类中的函数 ·面向对象的三大特性:封装、继承、多态
2.创建类和对象
·面向对象:[创建对象][通过对象调用函数,即执行方法]
·函数编程:[执行函数]
这个并不能说明函数编程就比面向对象简便:
函数编程应用场景:各个函数之间是独立的,且无共用的数据
3.类和对象在内存中如何保存
类和类中的方法在内存中只有一份,但是每个对象都在内存中存一份
如上所示:在创建对象时,除了封装name和age属性外,还会保存一个类对象指针:
当对象执行类中的方法时:
1>根据类对象指针找到类中的方法
2>将对象当做参数传给方法的self参数
4.封装:对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容
4.1)将内容封装到self中
self是一个形式参数,当执行obj1 = Foo('wupeiqi',18)时,self等于obj1;所以,内容其实就是被封装到了对象obj1和obj2中(方便在类中的函数中调用),每个对象中都有name、age属性
4.2)调用被封装的内容
4.2.1)通过对象直接调用
class Foo: def __init__(self, name, age): self.name = name self.age = age obj1 = Foo('wupeiqi', 18) print obj1.name # 直接调用obj1对象的name属性 print obj1.age # 直接调用obj1对象的age属性 obj2 = Foo('alex', 73) print obj2.name # 直接调用obj2对象的name属性 print obj2.age # 直接调用obj2对象的age属性
4.2.2)通过self间接调用
class Foo: def __init__(self, name, age): self.name = name self.age = age def detail(self): print self.name print self.age obj1 = Foo('wupeiqi', 18) obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18 obj2 = Foo('alex', 73) obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78
5.继承:对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法
5.1)单继承
5.2)多继承
5.2.1)经典类继承:深度优先-A-B-D-C
class D: def bar(self): print 'D.bar' class C(D): def bar(self): print 'C.bar' class B(D): def bar(self): print 'B.bar' class A(B, C): def bar(self): print 'A.bar' a = A()
5.2.2)新式类继承:父类继承object类:D(object)
广度优先:A-B-C-D
6.多态
6.1)子类重写父类方法
当子类和父类都存在相同的方法时,可以在子类中重写父类的方法,当然也可以选择不重写父类的方法,直接继承,这就是多态 "开闭原则" ·对扩展开放:允许子类重写父类方法函数 ·对修改封闭:不重写,直接继承父类方法函数
class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex def print_title(self): if self.sex == "male": print("man") elif self.sex == "female": print("woman") class Child(Person): # Child 继承 Person def print_title(self): if self.sex == "male": print("boy") elif self.sex == "female": print("girl") May = Child("May","female") Peter = Person("Peter","male") print(May.name,May.sex,Peter.name,Peter.sex) May.print_title() Peter.print_title()
6.2)子类重写构造函数
子类可以没有构造函数,表示同父类构造函数一致,但是要增加属性时,可以重写构造函数
class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex class Child(Person): # Child 继承 Person def __init__(self,name,sex,mother,father): Person.__init__(self,name,sex) # 子类对父类的构造方法的调用 self.mother = mother self.father = father May = Child("May","female","April","June") print(May.name,May.sex,May.mother,May.father)
以上是关于python博客是必须写的-3 面向对象的主要内容,如果未能解决你的问题,请参考以下文章