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 面向对象的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

python 面向对象的成员

python面向对象开发的自我理解

VSCode自定义代码片段——JS中的面向对象编程

Python 3学习 ——面向对象

VSCode自定义代码片段9——JS中的面向对象编程