面向对象

Posted chenxi67

tags:

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

一.函数式编程和面向对象的对比

  面向过程:根据业务逻辑从上到下写垒代码

  函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

  面向对象:对函数进行分类和封装,让开发“更快更好更强...”

  面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

  类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

  对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

请开发一个消息提醒的功能(邮件/短信/微信)

  函数:

def email(em,text):
    """
    发送邮件
    :return:
    """
    print(em,text)

def msg(tel,text):
    """
    发送短信
    :return:
    """
    print(tel,text)

def wechat(num,text):
    """
    发送微信
    :return:
    """
    print(num,text)
####便携功能
if 1==1:
    msg("15258569","网购买了一个学位课")
    email("[email protected]","网购买了一个学位课")
    wechat("xxxx","网购买了一个学位课")
#结果:15258569 网购买了一个学位课
#    [email protected] 网购买了一个学位课
#    xxxx 网购买了一个学位课

  面向对象:

class Message:
    def email(self,em, text):
        """
        发送邮件
        :return:
        """
        print(em, text)

    def msg(sellf,tel,text):
        """
        发送短信
        :return:
        """
        print(tel, text)

    def wechat(self,num, text):
        """
        发送微信
        :return:
        """
        print(num, text)
if 1==1:
    obj = Message()
    obj. msg("15258569","网购买了一个学位课")
    obj.email("[email protected]","网购买了一个学位课")
    obj.wechat("xxxx","网购买了一个学位课")
#结果:15258569 网购买了一个学位课
#    [email protected] 网购买了一个学位课
#    xxxx 网购买了一个学位课

总结:

  函数:定义简单/调用简单

  面向对象:定义复杂/调用复杂,    好处:归类,将某些类似的函数写在一起

  1.函数式编程可能会比面向对象好

  2.Python中支持两种编程方式

  3.面向对象方式格式:

     定义:

               class   类名:         ----定义了一个类

      def  函数名(self):    ---在类中编写了一个"方法" 

      调用:

       x1 = 类名()      ----创建了一个对象/实例化一个对象

       x1.函数名()      ----通过对象调用其中一个方法

  4. 实例

 

class Account:
    def login(self):
        user = input("请输入用户名")
        pwd = input("请输入密码")
        if user =="alex" and pwd =="sb":
            print("登录成功")
        else:
            print("登录失败")
obj = Account()
obj.login()

 

对比  打印

  函数

"""
完成以下功能:
    老狗/20岁/男/上山去砍柴
    老狗/20岁/男/开车去东北
    老狗/20岁/男/喜欢大宝剑
"""
def kc(name, age, gender):
    data = "%s,性别%s,今年%s岁,喜欢上山砍柴" % (name, gender, age)
    print(data)

def db(name, age, gender):
    data = "%s,性别%s,今年%s岁,喜欢开车去东北" % (name, gender, age)
    print(data)

def bj(name, age, gender):
    data = "%s,性别%s,今年%s岁,喜欢大宝剑" % (name, gender, age)
    print(data)

kc(老狗, 20, )
db(老狗, 20, )
bj(老狗, 20, )
# 结果:老狗,性别男,今年20岁,喜欢上山砍柴
#     老狗,性别男,今年20岁,喜欢开车去东北
#     老狗,性别男,今年20岁,喜欢大宝剑

  面向对象:

class LaoGou:
    def __init__(self, name, age, gender):  # 特殊的方法,如果 类名() ,则该方法会被自动执行 (构造方法)
        self.n1 = name
        self.n2 = age
        self.n3 = gender

    def kc(self):
        data = "%s,性别%s,今年%s岁,喜欢上山砍柴" % (self.n1, self.n3, self.n2)
        print(data)

    def db(self):
        data = "%s,性别%s,今年%s岁,喜欢开车去东北" % (self.n1, self.n3, self.n2)
        print(data)

    def bj(self):
        data = "%s,性别%s,今年%s岁,喜欢大宝剑" % (self.n1, self.n3, self.n2)
        print(data)
obj = LaoGou(老狗, 20, )
obj.kc()
obj.db()
obj.bj()
#结果:老狗,性别男,今年20岁,喜欢上山砍柴
#    老狗,性别男,今年20岁,喜欢开车去东北
#    老狗,性别男,今年20岁,喜欢大宝剑

总结:

  1.构造方法

    实例:

class Foo:
    def __init__(self,name):    #构造方法,目的进行数据初始化 
        self.name = name
        self.age = 18
obj = Foo("")

  通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可.

   2.应用

  a. 将数据封装到对象中,以供自己在方法中调用

 

class FileHandler:
    def __init__(self, file_path):
        self.file_path = file_path
        self.f = open(self.file_path, rb)
    def read_first(self):
        # self.f.read()
        # ...
        pass
    def read_last(self):
        # self.f.read()
        # ...
        pass
    def read_second(self):
        # self.f...
        # ...
        pass
obj = FileHandler(C:/xx/xx.log)
obj.read_first()
obj.read_last()
obj.read_second()
obj.f.close()

  b.将数据封装到对象中,以供其他函数调用 

def new_func(arg):
    arg.k1
    arg.k2
    arg.k6
class Foo:
    def __init__(self,k1,k2,k6):
        self.k1 = k1
        self.k2 = k2
        self.k6 = k6
obj = Foo(111,22,333)
new_func(obj)

二.面向对象代码如何编写

  1.规则

class Foo:
    def __init__(self, name):
        self.name = name
    def detail(self, msg):
        print(self.name, msg)
obj = Foo("")
obj.detail("")

  2.什么时候写?

   方式一方向:归类+提取公共值

   方式二正向:在指定类中编写和当前类相关的所有代码 + 提取公共值

三.面向对象的三大特性:封装/继承/多态 

  1.封装:

   将相关功能封装到一个类中:

class Message:
    def email(self):pass
    def msg(self):pass
    def wechat(self):pass

   将数据封装到一个对象中:

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
obj = Person(孙福来, 18, )

  2.继承:

class Base:  # 父类,基类
    def f2(self):
        print(f2)
class Foo(Base):  # 子类,派生类
    def f1(self):
        print(f1)
obj = Foo()
obj.f1()
obj.f2()
#结果: f1   f2

原则:先在自己类中找,没有就去父类

总结:

  1.继承编写

  class Foo(父类):

    pass

  2.支持多继承(先找左/再找右)

  3.为什么要有多继承?

    提供代码重用性

  3.多态

    多种形态或多种状态

 

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

面向面试编程代码片段之GC

PHP面向对象之选择工厂和更新工厂

Java中面向对象的三大特性之封装

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

Scala的面向对象与函数编程

Python面向对象学习之八,装饰器