参考文档:

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

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

  1. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  2. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  3. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  4. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  5. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  6. python学习笔记--Django入门0 安装dangjo

    经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...

  7. python学习笔记(一)元组,序列,字典

    python学习笔记(一)元组,序列,字典

  8. Pythoner | 你像从前一样的Python学习笔记

    Pythoner | 你像从前一样的Python学习笔记 Pythoner

  9. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  10. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

随机推荐

  1. hibernate关联关系笔记

    Hibernate关联关系笔记 单向N:1 *  有连接表:在N方使用<join>/<many-to-one>.1方无需配置与之关联的持久化类. *  没有连接表:在N方使用& ...

  2. 分组统计并计算每组数量sql

    有 字段A 和B比如数据如下A  B1  21  31  4 2  22  3 统计出的sql结果: A   count 1   3 2   2 select a,count(b) from t gr ...

  3. ouath原理

    1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...

  4. 经典的javascript函数实例,css的. #区别

    先贴javascript经典例子代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  5. IT人可以关注的站

    问答平台 知乎 很杂但很专业的社区,就像标题说的:与世界分享你的知识.经验和见解 segmentfault 专业面向开发者的中文技术问答社区 德问 编程社交问答 V2EX 可以看到很多有意思对我这种I ...

  6. avalon的表单验证

    表单验证 avalon内置了强大的表单验证功能,它需要结合ms-duplex, ms-validate, ms-rules这个三个指令一起使用. ms-duplex负责监控每个表单元素的输入. ms- ...

  7. IT行业常谈的优雅

    起因 前几天在群里和以前一起在成都培训的同学谈论到了求职, 有一位朋友说他在某家外包公司试用失败了, 然后我说了句:不要去外包公司.即使工资高一点. 其实说的时候也没考虑到他本人的处境, 毕竟还房贷资 ...

  8. ExpandoObject动态类生成属性转json

    using System; using System.Collections; using System.Collections.Generic; using System.Collections.O ...

  9. VS2015 + Cordova Html5开发使用Crosswalk Web引擎

    CrossWalk引擎的好处是统一不同android设备的Html5的差异性,据说速度很快. Vs2015中使用非常简单,作为一个Apache Cordova的插件安装即可: Installing t ...

  10. MVC中权限管理

    权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少.权限管理几乎出现在任何系统里面,只要有用户和密码的系统.权限管理还是比较复杂的,有的固定到某个模 ...