python学习笔记之类class(第六天)

     参考文档:

             1、金角大王博客:http://www.cnblogs.com/alex3714/articles/5188179.html

             2、银角大王博客:http://www.cnblogs.com/wupeiqi/articles/5017742.html

1、反射之__import__:

我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工作的。
        在一些程序中,我们可以动态地去调用函数,如果我们知道模块的名称(字符串)的时候,我们可以很方便的使用动态调用。

__import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals(),[]
__import__(‘os‘)    
__import__(‘os‘,globals(),locals(),[‘path‘,‘pip‘])  #等价于from os import path, pip



例: 以字符串的形式导入模块

mod = __import__(‘sys‘)
print(mod.path)

例:以字符串的形式调用模块中的函数

func = getattr(mod,‘path‘)
print(func)



例:从一个包中导入一个模块 ,包名为main,模块名为mod

aa = __import__(‘main.mod‘)

aa = __import__(‘main‘, globals={}, locals={}, fromlist=[‘mod‘])

aa = __import__(‘main‘,globals(),locals(),[‘mod‘])

m = getattr(aa, ‘mod‘)
print(m.first(‘kevin‘))

n = getattr(m, ‘first‘)
print(type(n))
n(‘kevin‘)



注:web框架中根据不同的URL,来加载不同的模块,进行不同的处理。

2、类与对象:

__init__ 的方法 完成初始化。构造函数

__del__ 的方法 对象销毁,析构函数

__call__ 调用方法

所有的实例方法都拥有一个 self 参数来传递当前实例,类似于 this。
       可以使用 __class__ 来访问类型成员。

还有些内置特殊的属性:

__doc__   #类型帮助信息

__name__ # 类型名称

__module__ # 类型所在模块
              __bases__ # 类型所继承的基类

__dict__ # 类型字典,存储所有类型成员信息。

例:



class peason(object):
    ‘‘‘this is peason class‘‘‘
    #静态字段
    aa = ‘nihao‘
    bb = [‘a‘,1,‘b‘,2,‘c‘,3]
    cc = {‘a‘:‘wangkai‘,‘b‘:‘gonghui‘}
    
    def __init__(self,name,flag):
        self.name = name                             #动态字段
        self.__flag = flag                               #私有字段

def __del__(self):
        print(‘i will go‘)
    
    def __call__(self,caa):                            #call方法
        print(‘this is call method‘,caa)

def __priv(self):                                    #私有方法 
        print(‘hello,this is privacy method‘,self.__flag)
    
    
    def first(self):                                       #动态方法
        print(‘hello,this is dymamic method‘,self.name)
        self.__priv()                                     #调用私有方法
        return self.__flag                              #调用私有字段
    
    @staticmethod                                     #静态方法
    def foo():
        print(‘this is static method‘)
    
    @property                                           #属性                
    def bar(self):
        print(self.name)
        self.__priv()
        return "this is property"
    
    @property                                         #属性(只读)

def flag(self):
        return self.__flag
    
    @flag.setter                                       #修改私有字段值
    def flag(self,value):
        self.__flag = value
        
print(‘#################‘)    
print(peason.__doc__,peason.__name__,peason.__module__,peason.__bases__,peason.__dict__)
print(‘#################‘)        
print(peason.aa,peason.bb,peason.cc)         #获取静态字段
print(‘#################‘)    
print(peason.foo())                                    #获取静态方法
print(‘#################‘)    
pp = peason(‘wang‘,‘true‘)                         #类实例化
print(pp.name)                                         #通过对象获取动态字段
print(‘#################‘)                
print(pp.first())                                          #通过对象获取动态方法
print(‘#################‘)          
print(pp.bar)                                             #通过对象获取属性
print(‘#################‘)          
print(pp._peason__priv())                          #特殊调用方式
print(‘#################‘)          
print(pp.flag)
pp.flag = ‘false‘                                         #通过属性修改私有字段值
print(pp.flag)

pp(‘aa‘)                                                      #call方法调用



注:静态的可以直接通过类来访问,而动态的只能通过调用对象的方式来访问;

私有字段和方法能通过方法和属性调用;

只读或只写的字段,修改需要@flag.setter 和 class peason(object):来实现

3、继承:

Python编程中类可以承继父类属性,形式为class 类名(父类),子类可以继承父类的所有方法和属性,也可以重载父类的成员函数及属性,须注意的是子类成员函数若重载父类(即名字相同),则会使用子类成员函数

例:


class SchoolMember(object):    members = 0 #初始学校人数为0    def __init__(self,name,age):        self.name = name        self.age = age

    def  tell(self):        pass

    def enroll(self):        ‘‘‘注册‘‘‘        SchoolMember.members +=1        print("\033[32;1mnew member [%s] is enrolled,now there are [%s] members.\033[0m " %(self.name,SchoolMember.members))

    def __del__(self):        ‘‘‘析构方法‘‘‘        print("\033[31;1mmember [%s] is dead!\033[0m" %self.name)

class Teacher(SchoolMember):    def __init__(self,name,age,course,salary):        super(Teacher,self).__init__(name,age)        self.course = course        self.salary = salary        self.enroll()

    def teaching(self):        ‘‘‘讲课方法‘‘‘        print("Teacher [%s] is teaching [%s] for class [%s]" %(self.name,self.course,‘s12‘))

    def tell(self):        ‘‘‘自我介绍方法‘‘‘        msg = ‘‘‘Hi, my name is [%s], works for [%s] as a [%s] teacher !‘‘‘ %(self.name,‘Oldboy‘, self.course)        print(msg)

class Student(SchoolMember):    def __init__(self, name,age,grade,sid):        super(Student,self).__init__(name,age)        self.grade = grade        self.sid = sid        self.enroll()

    def tell(self):        ‘‘‘自我介绍方法‘‘‘        msg = ‘‘‘Hi, my name is [%s], I‘m studying [%s] in [%s]!‘‘‘ %(self.name, self.grade,‘Oldboy‘)        print(msg)

if __name__ == ‘__main__‘:    t1 = Teacher("Alex",22,‘Python‘,20000)    t2 = Teacher("TengLan",29,‘Linux‘,3000)

    s1 = Student("Qinghua", 24,"Python S12",1483)    s2 = Student("SanJiang", 26,"Python S12",1484)

    t1.teaching()    t2.teaching()    t1.tell()      


       新式类以object为基类,在python3之后版本原来有经典类将不在使用,而且新式类的多类继承是以广度代替了经典类的深度搜索方式。

        例,A、B、C、D四个类,其中B和C继承A,D又继承B和C,即class D(B,C)

继承的方法:

经典类的搜索顺序是B,A,C     搜索到第一个方法结束

新式类的搜索顺序是B,C。

例:经典类写法



class A(object):
    def __init__(self):
        print(‘this is class A‘)
    def test(self):
        print(‘this is parent test‘)
        
class B(A):
    def __init__(self):
        print(‘this is class B‘)
        
class C(A):
    def __init__(self):
        print(‘this is class C‘)
    def test(self):
        print(‘this is son C test‘)
        
class D(B,C):
    def __init__(self):
        print(‘this is class D‘)
    
R = D()
R.test()

经典类写法结果为:

this is class D
this is parent test

新式类写法结果为:

this is class D
this is son C test



4、抽象类+抽象方法 = 接口 (用于规范)

由于python 没有抽象类、接口的概念,所以要实现这种功能得abc.py 这个类库,

抽象基类(或者ABCs)是Python里一个相同的特性。抽象基类由abc模块构成,包含了一个叫做ABCMeta的metaclass。这个metaclass由内置的isinstance()和issubclass()特别处理

具体方式如下:



from abc import ABCMeta,abstractmethod
from _pyio import __metaclass__

class headers(object):
    __metaclass__ = ABCMeta
    
    def __init__(self):
        print(‘this is abc class‘)
        
    @abstractmethod
    def fun(self):
        pass
    
class foo(headers):
    def __init__(self):
        print(‘__init__‘)
        
    def fun(self):
        print(‘foo.fun‘)
        
f = foo()
f.fun()

时间: 2024-10-20 07:05:33

python学习笔记之类class(第六天)的相关文章

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

python学习笔记12-模块使用

python学习笔记12-模块使用 模块os,sys 什么是模块? 模块os,sys 模块是Python组织代码的一种基本方式 一个Python脚本可以单独运行,也可以导入到另外一个脚本运行,用import hello语句来导入,不用加入.py 什么是Python的 包? Python的模块可以按照目录组织为包 创建一个包的步骤: 创建一个名字为包名的目录 在改目录下创建一个__init__.py文件 根据需要,在该目录下存放脚本文件或已编译的扩展及子包 import pack.m1,pack.

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

Python学习笔记--未经排版

Python 学习笔记 Python中如何做到Print() 不换行 答:Print("输出内容",end='不换行的分隔内容'),其中end=后面为2个单引号 注:在Python 2.x中,Print "输出内容", 即在输出内容后加一逗号 Python中 is 和 == 的区别 答:Python中的对象包含三要素:id.type.value 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

python 学习笔记 14 -- 常用的时间模块之datetime

书接上文,前面我们讲到<常用的时间模块之time>,这次我们学习datetime -- 日期和时间值管理模块 使用apihelper 查看datetime 模块,我们可以看到简单的几项: date       ---  日期对象,结构为date(year, month, day) time       ---  时间值对象,结构为 time([hour[, minute[, second[, microsecond[, tzinfo]]]]]).时间对象所有的参数都是可选的.tzinfo 可以

python 学习笔记 6 -- 异常处理

当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了. 那么如果你是在IDE中运行,一个错误发生,异常会被打引出来,这便是未处理异常:当异常发生时,如果没有代码去关注和处理它,这些异常会传给置在Python中的缺省处理,他会输出一些调试信息并且终止运行.如果是在IDE中,这不是什么大事,但是如果是Python程序运行中的异常,它会导致整个程序终止,对于这些情况可以使用异常来处理. 1.try..exce

python 学习笔记 3 -- 数据结构篇上

数据结构是可以处理一些 数据 的 结构 .或者说,它们是用来存储一组相关数据的.在Python中有三种内建的数据结构--列表.元组和字典.本文主要对这三种数据类型以及相关的使用做介绍,以例子的形式演示更加容易理解! 1.列表(List) 列表是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目.在Python中,你在每个项目之间用逗号分割. 列表中的项目应该包括在**方括号**中,这样Python就知道你是在指明一个列表.一旦你创建了一个列表,你可以添加.删除或是搜索列表中的

python 学习笔记 3 -- 数据结构篇下

5.引用 当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存.这被称作名称到对象的绑定.eg. [python] view plaincopy # -*- coding: utf-8 -*- shoplist = ['apple', 'mango', 'carrot', 'banana'] print "we copy the shoplist to mylist directly \"with