zoukankan      html  css  js  c++  java
  • Python面向对象编程(四)

    1.多态

    多态的概念虽然现在才说,但是我们一直在用。多态就是多种形态的意思,动物都猫,狗,猪等等,这些都是动物的多种形态。

    反映在Python中,多态就意味着就算不知道变量所引用的对象类型是什么,也能对它进行操作。比如序列类型有计算长度的方法len(),那我们拿到一个序列类型x,我们不需要知道x是什么类型,只需要知道它是序列类型,那我们就可以用len(x)的方法计算x的长度。这就是多态性,Python本身就是多态的

    当然我们学过一个内置函数isinstance(),可以用它来判断数据类型,但是这可不符合多态优美的特性

    2.绑定方法与非绑定方法

    类里面定义的函数有两种,绑定方法和非绑定方法

    1)绑定方法

    绑定方法又分为绑定给类的方法和绑定给对象用的方法。

    凡是定义在类中,且没有被任何装饰器修饰的方法,都是绑定给对象用的方法。

      特点是obj.func()会自动把obj当作第一个参数传入,因为func的逻辑就是要处理obj
    在类中定义的被classmethod装饰器修饰的方法,就是绑定给类的方法

      特点是cls.func()会自动把类cls当作第一个参数传入,因为func的逻辑是处理cls,就算是对象调用这个函数,也是把类当成第一个参数传入

    class People:
        def __init__(self,name):
            self.name=name
        def bar(self):
            print('----->',self.name)
    
        @classmethod
        def func(cls):
            print(cls)
    
    p1=People('zhang')
    p1.func()   #<class '__main__.People'>
    People.func()#<class '__main__.People'>

    2)非绑定方法

    还有一种方法是既不绑定给类,也不绑定给对象的,叫做非绑定方法

    用staticmethod装饰器装饰

    #文件名:pickle_test
    import hashlib
    import time
    import pickle
    import os
    student_path=r'C:UsersAdministratorPycharmProjects	eststudent'
    
    class People:
        def __init__(self,name,sex,user_id):
            self.name=name
            self.sex=sex
            self.user_id=user_id
            self.id = self.create_id()
    
        def tell_info(self):
            print('''
            --------%s info--------
            id:%s
            name:%s
            sex:%s
            user_id:%s
            ''' %(self.name,self.id,self.name,self.sex,self.user_id))
    
        def create_id(self):
            m=hashlib.md5()
            m.update(self.name.encode('utf-8'))
            m.update(self.sex.encode('utf-8'))
            m.update(str(self.user_id).encode('utf-8'))
            return m.hexdigest()
    
        def save(self):
            with open(self.id,'wb') as f:
                pickle.dump(self,f)
    
        @staticmethod #非绑定方法,就是一个函数,就是一个工具而已,不需要类,也不需对象
        def get_all():
            res = os.listdir(student_path)
            for item in res:
                file_path=r'%s\%s' %(student_path,item)
                with open(file_path,'rb') as f:
                    obj=pickle.load(f)
                    obj.tell_info()
    
    #反序列化.py
    from pickle_test import People
    p=People('zhang','male',123123123)
    p.get_all()

    3.软件开发规范

    在真正的软件开发过程中,并不是把所有代码写在一个文件中的,可以想象一下,一个小程序大概有10000行代码,都写在一个文件中的话,你还干这行吗?

    正确的方式应该是把程序拆成一个一个模块。比如常用的bin目录放可执行文件,conf目录放配置文件

    db目录放数据,log目录放日志文件,lib目录放库,src目录放一些重要的代码,比如重要的逻辑,类的定义等

  • 相关阅读:
    for循环嵌套的原理
    php for循环|求1-100之间被3整除且被5不整除的偶数
    php 1-100之间能被3整除的数字之和;
    php判断某年某月有多少天
    关系运算符
    变量
    习题5-7 使用函数求余弦函数的近似值
    习题5-6 使用函数输出水仙花数
    习题4-11 兔子繁衍问题
    习题4-9 打印菱形图案
  • 原文地址:https://www.cnblogs.com/zhang-can/p/7142671.html
Copyright © 2011-2022 走看看