python --- 面向对象

Posted 最底层

tags:

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

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

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

    函数 :

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

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

def wechat(num,text):
    """
    发送微信
    :return:
    """
    print(num,text)


# 编写功能:假设用户购买课程,然后给alex发送提醒;
if 1==1:
    msg(188888888,张进购买了一个学位课)
    email([email protected],张进购买了一个学位课)
    wechat(xxxx,张进购买了一个学位课)

    面向对象 : 

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

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

    def wechat(self, num, text):
        """
        发送微信
        :return:
        """
        print(num,text)


# 编写功能:假设用户购买课程,然后给alex发送提醒;
if 1==1:
    obj = Message()
    obj.email([email protected], 张进购买了一个学位课)
    obj.msg(188888888,张进购买了一个学位课)
    obj.wechat(xxxx,张进购买了一个学位课)
对比:
函数:定义简单/调用简单
面向对象:定义复杂/调用复杂 好处:归类,将某些类似的函数写在一起

总结:
1. 函数式编程可能会比面向对象好.
2. Python中支持两种编程方式.
3. 面向对象方式格式:
定义:
      class 类名:              - 定义了一个类
         
         def 函数名(self):    - 在类中编写了一个"方法"
            pass 
   调用:
      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()

  2 . round 2 打印

"""
完成以下功能:
    老狗/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,‘男‘)
kc(‘老狗‘,20,‘男‘)
db(‘老狗‘,20,‘男‘)
bj(‘老狗‘,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()

    总结 :

      1.构造方法 :

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

obj = Foo(侯明魏)

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

# 示例二:    
class Bar:
    pass 
obj = Bar()

      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.read()
        # ...
        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. 用户登录
2. 显示当前用户信息
3. 查看当前用户所有的账单
4. 购买姑娘形状的抱枕
class UserInfo:

    def __init__(self):
        self.name = None

    def info(self):
        print(当前用户名称:%s %(self.name,))

    def account(self):
        print(当前用户%s的账单是:.... %(self.name,))

    def shopping(self):
        print(%s购买了一个人形抱枕 %(self.name,))

    def login(self):
        user = input(请输入用户名:)
        pwd = input(请输入密码:)
        if pwd == sb:
            self.name = user
            while True:
                print("""
                    1. 查看用户信息
                    2. 查看用户账单
                    3. 购买抱枕
                """)
                num = int(input(请输入选择的序号:))
                if num == 1:
                    self.info()
                elif num ==2:
                    self.account()
                elif num == 3:
                    self.shopping()
                else:
                    print(序号不存在,请重新输入)
        else:
            print(登录失败)

obj = UserInfo()
obj.login()

    总结 :

class Foo:
    def func2(self):
        print(func2)
    
    def func1(self):
        self.fun2()
        print(func1)
        
        
obj = Foo()
obj.func1()

 

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

  1.规则

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

  2.什么时候写?如何写?

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

      归类 :

class File:
    def file_read(self,file_path):
        pass

    def file_update(self,file_path):
        pass

    def file_delete(self,file_path):
        pass

    def file_add(self,file_path):
        pass

class Excel:
    def excel_read(self,file_path):
        pass

    def excel_update(self,file_path):
        pass

    def excel_delete(self,file_path):
        pass

    def excel_add(self,file_path):
        pass

      提取公共值 :

class File:
    def __init__(self,file_path):
        self.file_path = file_path
        
    def file_read(self):
        pass

    def file_update(self):
        pass

    def file_delete(self):
        pass

    def file_add(self):
        pass

class Excel:
    def __init__(self,file_path):
        self.file_path = file_path
        
    def excel_read(self):
        pass

    def excel_update(self):
        pass

    def excel_delete(self):
        pass

    def excel_add(self):
        pass

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

class Message:
    def email(self):    
        pass 

class Person:
    def __init__(self,na, gen, age, fig)
        self.name = na
        self.gender = gen
        self.age = age
        self.fight =fig
        
    def grassland(self):    
        self.fight = self.fight - 10  
        
    def practice(self):
        self.fight = self.fight + 90   
        
    def incest(self):
        self.fight = self.fight - 666
        

cang = Person(苍井井, , 18, 1000)    # 创建苍井井角色
dong = Person(东尼木木, , 20, 1800)  # 创建东尼木木角色
bo = Person(波多多, , 19, 2500)      # 创建波多多角色

dong.grassland()

三 . 面向对象的三大特性

  1 . 封装

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

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

    b . 将数据封装到一个对象中

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

  2 . 继承

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()    

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

    总结:

      1. 继承编写 

        class Foo(父类):
      pass

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


3. 为什么要有多继承?
        提供代码重用性

  3 . 多态

    多种形态或多种状态

    鸭子模型,只要可以嘎嘎叫就是鸭子

    由于python原生态支持多态,所以没有特殊性

class Foo1:
    def f1(self):
        pass 

class Foo2:
    def f1(self):
        pass 

class Foo3:
    def f1(self):
        pass 
        
        
def func(arg):
    arg.f1()
    
obj = Foo1() # obj= Foo2()   obj = Foo3()
func(obj)

 




















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

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

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

python:第二部分:面向对象:面向对象object orinted

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

Python 面向对象

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