4月16日 python学习总结 封装之property、多态 、classmethod和staticmethod

一、封装之property

  @property把一个函数伪装成一个数据类型

   @伪装成数据的函数名.setter   控制该数据的修改,修改该数据时触发

   @伪装成数据的函数名.delect  控制该数据的删除,删除该数据时触发

class People:
    def __init__(self,name):
        self.__name=name

    @property                  #将name()函数伪装成一个数据属性name
    def name(self): #obj.name
        print(‘您现在访问的是用户名。。。‘)
        return self.__name

    @name.setter #obj.name=‘EGON‘      执行 name=x 修改 name 值时触发该方法
    def name(self,x):
        # print(‘=================‘,x)
        if type(x) is not str:
            raise TypeError(‘名字必须是str类型,傻叉‘)
        self.__name=x

    @name.deleter         # 执行 del 对象.name 时触发该方法
    def name(self):
        # print(‘就不让你删‘)
        del self.__name

obj=People(‘egon‘)

# print(obj.name)
# print(obj.name())

# print(obj.name)

# obj.name=‘EGON‘

# print(obj.name)

# obj.name=123

del obj.name
obj.name

二、多态    

1、 什么是多态
      多态指的是同一种事物多种形态

2、为什要用多态
用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以
在不用考虑对象具体类型的前提下而直接使用对象下的方法

3、多态性:一种调用方式,不同的执行效果(多态性)

    注意:多态与多态性是两种概念

    4、多态的使用

      • 继承 

        class Animal:
            def eat(self):
                pass
            def bark(self):
                 print(‘叫‘)
        
        class Cat(Animal):
            def jiao(self):
                print(‘喵喵喵‘)
        
        class Dog(Animal):
            def speak(self):
                print(‘汪汪汪‘)
        
        class Pig(Animal):
            def han(self):
                print(‘哼哼哼‘)
        
        c=Cat()
        d=Dog()
        p=Pig()
        
        # 多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法
        # c.eat()
        # d.eat()
        # p.eat()
        
        # d.bark()
        # p.bark()
        # c.bark()
        
        d.speak()
        c.jiao()
        p.han()

         

      • 抽象类

        import abc #abstract class
        class Animal(metaclass=abc.ABCMeta):
            @abc.abstractmethod
            def eat(self):
                pass
        
            @abc.abstractmethod
            def bark(self):
                pass
        
        # obj=Animal() # 抽象基类本身不能被实例化
        
        class Cat(Animal):
            def eat(self):
                print(‘cat eat‘)
        
            def bark(self):
                print(‘喵喵喵‘)
        
        class Dog(Animal):
            def eat(self):
                print(‘dog eat‘)
        
            def bark(self):
                print(‘汪汪汪‘)
        
        class Pig(Animal):
            def eat(self):
                print(‘pig eat‘)
            def bark(self):
                print(‘哼哼哼‘)
        
        c=Cat()
        d=Dog()
        p=Pig()
        
        # c.bark()
        # d.bark()
        # p.bark()
        
        # def BARK(Animal):       向上转型
        #     Animal.bark()
        #
        #
        # BARK(c)
        # BARK(d)
        # BARK(p)
      • 鸭子类型(长得像鸭子就被当作是鸭子)

        class Foo:
            def f1(self):
                print(‘from foo.f1‘)
        
            def f2(self):
                print(‘from foo.f2‘)
        
        class Bar:
            def f1(self):
                print(‘from bar.f1‘)
        
            def f2(self):
                print(‘from bar.f2‘)
        
        obj1=Foo()
        obj2=Bar()
        
        obj1.f1()
        obj1.f2()
        
        obj2.f1()
        obj2.f2()
        
        class Disk:
            def read(self):
                print(‘disk read‘)
        
            def write(self):
                print(‘disk write‘)
        
        class Txt:
            def read(self):
                print(‘txt read‘)
        
            def write(self):
                print(‘txt write‘)
        
        class Process:
            def read(self):
                print(‘process read‘)
        
            def write(self):
                print(‘process write‘)
        
        obj1=Disk()
        obj2=Txt()
        obj3=Process()
        
        obj1.read()
        obj2.read()
        obj3.read()

三、classmethod和staticmethod

  classmethod 

   绑定方法:

     在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法

      1.  绑定对象的方法特殊之处:

应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入

2.  绑定到类的方法特殊之处:

应该由类来调用,类来调用,会自动将类当作第一个参数传入  

import settings

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

    def tell(self):
        print(‘%s:%s‘ %(self.name,self.age))

    @classmethod
    def from_conf(cls):
        return cls(settings.NAME,settings.AGE)

# p=People(‘egon‘,19)
# p.tell()

# p1=People(settings.NAME,settings.AGE)
# p1.tell()

# p2=People(settings.Name,settings.AGE)

# p3=People(‘alex‘,74)
# p3.tell()

# print(People.from_conf)
# p4=People.from_conf(People)
# print(People.from_conf)
# p4=People.from_conf()
# p4.tell()

      

2、staticmethod:

非绑定方法,就是一个普通函数

特性: 既不跟类绑定,也不跟对象绑定,这意味着谁都能用

谁来用都是一个普通函数,也就是说没有自动传值的特性了

import settings
import hashlib
import time

class People:
    def __init__(self,name,age):
        self.uid=self.create_id()
        self.name=name
        self.age=age

    def tell(self):
        print(‘%s: %s:%s‘ %(self.uid,self.name,self.age))

    @classmethod
    def from_conf(cls):
        return cls(settings.NAME,settings.AGE)

    @staticmethod
    def create_id():
        m=hashlib.md5()
        m.update(str(time.clock()).encode(‘utf-8‘))
        return m.hexdigest()

obj=People(‘egon‘,18)
# print(obj.uid,obj.name,obj.age)
# obj.tell()

# print(obj.create_id)
# print(People.create_id)

print(obj.create_id())
print(People.create_id())

作业、

‘‘‘
4月16
‘‘‘
‘‘‘
1、定义MySQL类(参考答案:http://www.cnblogs.com/linhaifeng/articles/7341177.html#_label5)
      1.对象有id、host、port三个属性
      2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一
      3.提供两种实例化方式,方式一:用户传入host和port 方式二:从配置文件中读取host和port进行实例化
      4.为对象定制方法,save和get_obj_by_id,save能自动将对象序列化到文件中,文件路径为配置文件中DB_PATH,文件名为id号,
          保存之前验证对象是否已经存在,若存在则抛出异常,;get_obj_by_id方法用来从文件中反序列化出对象
‘‘‘
import hashlib
import time
import pickle
import os
from days22 import setting

class MySQL:
    def __init__(self, host, port):
        self.__host = host
        self.__port = port
        self.__id = self.create_id()

    @staticmethod
    def create_id():
        m = hashlib.md5()
        m.update(str(time.clock()).encode(‘utf-8‘))
        return m.hexdigest()

    @classmethod
    def creae_mysql(cla):
        return cla(setting.HOST, setting.PORT)

    def save(self):
        path = os.path.join(setting.DB_PATH, ‘%s.pk‘ % self.__id)
        if os.path.exists(path):
            raise ImportError(‘该id已存在‘)
        else:
            with open(path, ‘wb‘)as f:
                pickle.dump(self, f)

    def get_obj_by_id(self):
        path = os.path.join(setting.DB_PATH, ‘%s.pk‘ % self.__id)
        if not os.path.exists(path):
            raise ImportError(‘该id不存在‘)
            # print(‘该id不存在‘)
        else:
            with open(path, ‘rb‘)as f:
                return pickle.load(f)

# m1 = MySQL(‘h1‘, ‘p1‘)
# m2 = MySQL.creae_mysql()
#
# m2.save()
# print(m2.get_obj_by_id().__dict__)
#
# # m1.save()
# m1.get_obj_by_id()

‘‘‘
2、定义一个类:圆形,该类有半径,周长,面积等属性,将半径隐藏起来,将周长与面积开放
    参考答案(http://www.cnblogs.com/linhaifeng/articles/7340801.html#_label4)
‘‘‘
class Circle:
    def __init__(self,radius):
        self.__radius=radius
    @property
    def perimeter(self):
        return 2*(3.14)*self.__radius
    @property
    def area(self):
        return (3.14)*(self.__radius**2)

# c1=Circle(3)
# print(c1.area)
# print(c1.perimeter)

‘‘‘
3、明日默写
        1、简述面向对象三大特性:继承、封装、多态
            继承:继承是一种新建类的方式,新建类称之为子类或派生类,父类称之为基类或者超类,子类会‘遗传’父类的属性
            封装:装就是把一对属性装起来,封就是把这些属性藏起来
                  封装对外隐藏,对内开放
            多态:一种事物的多种形态;多态主要体现在继承、抽象类抽象方法、鸭子类型
            多态性:调用同方一方法,有不同的执行效果
        2、定义一个人的类,人有名字,身高,体重,用property讲体质参数封装成人的数据属性
            class People:
                def __init__(self,name,hight,weight):
                    self.__name=name
                    self.__hight=hight
                    self.__weight=weight
                @property
                def bmi(self):
                    return self.__weight/(self.__hight**2)
        3、简述什么是绑定方法与非绑定方法,他们各自的特点是什么?
            绑定方法:在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法
                     若该函数是绑定给类用的,称之为类的绑定方法
            非绑定方法:既不跟类绑定,也不跟对象绑定,这意味着谁都能用
                       谁来用都是一个普通函数,也就是说没有自动传值的特性了
‘‘‘

    

原文地址:https://www.cnblogs.com/95lyj/p/8856367.html

时间: 2024-10-09 11:13:47

4月16日 python学习总结 封装之property、多态 、classmethod和staticmethod的相关文章

5月16日上午学习日志

2017年5月16日上午把昨天记忆的英语单词的多种词意用自己组句的方法联系起来再记忆一遍,然后再联系真题学10个考研高频词汇,然后再复习昨天的词汇,听外教讲授Eclipse 的课程.

4月12日 python学习总结 继承和派生

一.继承 什么是继承:   继承是一种新建类的方式,在python中支持一个子类继承多个父类   新建类称为子类或派生类   父类可以称之为基类或者超类   子类会遗传父类的属性 2.  为什么继承 减少代码冗余 3. 定义方式: class Parent: pass class SubClass(Parent): pass print(SubClass.__bases__) #查看类的父类 4.  继承,调用父类方法以及self class Foo: def f1(self): print('

6月11日 python学习总结 框架理论

Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"

4月27日 python学习总结 GIL、进程池、线程池、同步、异步、阻塞、非阻塞

一.GIL:全局解释器锁 1 .GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的, 同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.GIL的优缺点: 优点:  保证Cpython解释器内存管理的线程安全 缺点:同一进程内所有的线程同一时刻只能有一个执行,也就说Cpython解释器的多线程无法实现并行 二.GIL与多线程 有了GIL的存在,同一时刻同一进程中只有一个线程被执行 听到这里,有的同学立马质问:进程可以利用多核,但是开销大,而python的多线程开销

5月16日下午学习日志

下午学习了通信原理,写了一套四级真题,首次接触java和Eclipse,了解到Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的.具有商业品质的工业平台.它主要由Eclipse项目.Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成--Eclipse Platform.JDT.CDT和PDE.JDT支持Java开发.CDT支持C开发.PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通

4月4日 python学习总结

---恢复内容开始--- 1.序列化和反序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling. 为什么要保持序列化?   1.持久化状态 2.跨平台数据交互 各种语言之间,实现数据相互转换 2.json.eval.pickle eval()虽然也能进行数据提取,但是,eval()只能识别python 定义的数据类型,用来做序列化不具有跨平台型 Json的使用

4月23日 python学习总结 套接字UDP和 操作系统理论,多道理论

一.套接字UDP udp是无链接的,先启动哪一端都不会报错 UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务.不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了. 即面向消息的通信是有消息保护边界的.   服务器 #服务器 ss = socket

4月28日 python学习总结 线程与协程

一. 异步与回调机制 问题: 1.任务的返回值不能得到及时的处理,必须等到所有任务都运行完毕才能统一进行处理 2.解析的过程是串行执行的,如果解析一次需要花费2s,解析9次则需要花费18s 解决一: (线程实现异步,回调解析结果) from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor from threading import current_thread import requests import os i

9月16日python练习

1.输出商品列表,用户输入序号,显示用户选中的商品 商品 li = ["手机", "电脑", '鼠标垫', '游艇'] #!/usr/bin/env python # coding:utf-8 li = ["手机", "电脑", '鼠标垫', '游艇'] for i in range(len(li) ): print (i+1,li[i]) #!/usr/bin/env python # coding:utf-8 for i