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目录放一些重要的代码,比如重要的逻辑,类的定义等

原文地址:https://www.cnblogs.com/zhang-can/p/7142671.html