面向对象(初级篇)

Posted kend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象(初级篇)相关的知识,希望对你有一定的参考价值。

一. 面向对象代码如何编写
面向对象编程需要使用"""对象"来实现, 面向对象编程就是对"""对象"的使用
类: 就是一个模板,模板里可以包含多个函数, 函数实现一些功能
对象: 就是根据模板创建的实例, 通过实例对象可以执行类中的函数


class Foo:   # 创建类
    def Bar(self):  #创建类中的函数, 在类中定义的函数叫方法
        pass
obj = Foo()  #根据类创建对象obj
创建对象就是在类Foo() 的后面加括号即可


class Foo:
    def bar(self):
        print("bar")

    def hello(self,name):
        print("i am %s" % name)

根据类Foo 创建对象obj
obj = Foo()     # 创建对象
obj.bar()      # 通过对象调用方法bar
obj.hello("alex") # 通过对象调用方法hello

总结
面向对象: 创建对象 ---> 通过对象执行方法



二. 面向对象三个特征:封装, 继承,  多态(了解)
1. 封装:
    将内容封装在某处
    从某处调用被封装的内容

先封装:
class Foo:

    def __init__(self,name,age):  #构造方法
        self.name = name
        self.age = age

根据Foo创建对象
自动执行Foo 类的__init__方法
obj1 = Foo("张三",20)   # 将 "张三" 和 "20" 分别封装在 obj1 和 self 的name 和 age 属性中
obj2 = Foo("李四",22)   # 将 "李四" 和 "22" 分别封装在 obj1 和 self 的name 和 age 属性中

self是一个形式参数, 当执行 obj1 = Foo("张三",20)的时候, self = obj1
                    当执行 obj2 = Foo("李四",22)的时候, self = obj2
所以内容其实被封装在了对象 obj1 和obj2 里面了, 每个对象里面都有 name 和age属性


再调用:
被调用有两种情况:
    通过对象直接调用
    通过self 间接调用

直接调用:
class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

obj = Foo("alex",22)
print(obj.name)
print(obj.age)

通过self 间接调用被封装的内容:
class Foo:

    def __init__(self,name,age):
        self.name = name
        self,age = age

    def detail(self):
        print(self.name)
        print(self.age)

obj = Foo("alex", 22)
obj.detail()# Python默认会将obj1传给self参数,即:obj1.detail(obj1),
所以,此时方法内部的 self = obj,即:self.name 是 alex ;self.age 是22

总结:面向对象的封装就是使用构造方法(__init__方法)将内容封装到对象中,
然后通过对象直接或者 self间接获取被封装的内容

2. 继承
########################1. 基本使用 ###########################

##### 基本写法
"""
class SuperBase:
    def f3(self):
        print(‘f3‘)

class Base(SuperBase):  # 父类,基类
    def f2(self):
        print(‘f2‘)

class Foo(Base):        # 子类,派生类

    def f1(self):
        print(‘f1‘)

obj = Foo()
obj.f1()
obj.f2()
obj.f3()
# 原则:现在自己类中找,么有就去父类
"""

分别为猫和狗创建一个类
class 猫:

    def 喵喵叫(self):
        print 喵喵叫

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

class 狗:

    def 汪汪叫(self):
        print 喵喵叫

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something
吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次
如果使用继承 可以如下
class 动物:

    def 吃(self):
      # do something

    def 喝(self):
      # do something

    def 拉(self):
      # do something

    def 撒(self):
      # do something

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物):

    def 喵喵叫(self):
        print(喵喵叫)

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物):

    def 汪汪叫(self):
        print(wangwang叫)

总结: 对于面向对象的继承而言,就是将多个类共有的方法提取到父类中, 子类仅需继承父类的就行

class Parents: #父类
    def func(self): #父类的方法
        pass

class children: #子类  子类继承父类,有父类中的所有方法
    pass

zi = children() #创建子类对象
zi.func() #调用父类中的方法


#练习
"""
class Base:
    def f1(self):
        print(‘base.f1‘)

    def f3(self):
        self.f1() # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
        print(‘base.f3‘)

class Foo(Base):
    def f1(self):
        print(‘foo.f1‘)

    def f2(self):
        print(‘foo.f2‘)
        self.f3()  # obj是那一个类(Foo),那么执行方法时,就从该类开始找.


obj = Foo()
obj.f2()  # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
# foo.f2
# foo.f1
# base.f3

obj2 = Base()
obj2.f3()
# base.f1
# base.f3
"""
# 总结: self是哪个类的对象,那么就从该类开始找(自己没有就找父类)


如果是多继承呢? (先继承左边的,再继承右边的)
########################2. 多继承 ###########################
"""
class Base1:
    def show(self):
        print(‘Base1.show‘)

class Base2:
    def show(self):
        print(‘Base2.show‘)

class Foo(Base1,Base2):
    pass

obj = Foo()
obj.show()
"""
# 左边更亲

class Base1:
    def f1(self):
        print(base1.1)
    def f2(self):
        print(base1.f2)

class Base2:
    def f1(self):
        print(base2.f1)

    def f2(self):
        print(base2.f2)

    def f3(self):
        print(base2.f3)
        self.f1()

class Foo(Base1,Base2):

    def f0(self):
        print(foo.f0)
        self.f3()
# 1. 多继承先找左边
# 2. self到底是谁,self是那个类的对象,那么就从该类开始找(自己没有就找父类)
obj = Foo()
obj.f0()
#结果
# foo.f0
# base2.f3
# base1.1



class Base:
    def f1(self):
        print(base.f1)

class Foo(Base):
    def f3(self):
        print(foo.f3)

    def f2(self):
        print(foo.f2)
        self.f3() # obj是那一个类(Foo),那么执行方法时,就从该类开始找.

obj = Foo()
obj.f2() # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
#结果
# foo.f2
# foo.f3


3. 多态: 指的是一种事物有多重形态
动物有多种形态: 人, 狗, 猫
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class People(Animal): #动物的形态之一:人
    def talk(self):
        print(say hello)

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print(say wangwang)

class Pig(Animal): #动物的形态之三:猫
    def talk(self):
        print(say miaomiao)

 

以上是关于面向对象(初级篇)的主要内容,如果未能解决你的问题,请参考以下文章

Python 面向对象(初级篇)

面向对象初级篇

Python 面向对象(初级篇)

Python 面向对象(初级篇)

面向对象编程其实很简单——Python 面向对象(初级篇)

Python之面向对象(初级篇)