• D07——C语言基础学PYTHON


    C语言基础学习PYTHON——基础学习D07

    20180826内容纲要:

      面向对象进阶学习

        1 静态方法

        2 类方法

        3 属性方法

        4 类的特殊成员方法(本节重点)

        5 反射(本节重点)

        6 异常(本节重点)

        7 动态导入模块 

        8 小结

        9 练习

    0 类的创建(补充)

     1 class Foo(object):
     2     def __init__(self,name):
     3         self.name = name
     4 
     5 f =Foo("erha")
     6 print(type(f))
     7 print(type(Foo))
     8 #输出结果:
     9 # <class '__main__.Foo'>
    10 # <class 'type'>
    11 #发现f的类型是 类__main__.Foo,而Foo的类型是  类,类型
    第一种方法
     1 #那么我们来看一下类的第二种创建方法
     2 def func(self):
     3     print("ni shi sha zi ba")
     4 
     5 Foo =type('Foo',(),{'func':func})
     6 f =Foo()
     7 f.func()
     8 print(type(Foo))
     9 '''
    10 #这样看上和第一种有点不一样,因为没有构造函数还没有传参。那怎么操作呢?
    11 
    12 def func(self):
    13     print("%s 今年 %s 岁了"%(self.name,self.age))
    14 
    15 def __init__(self,name,age):
    16     self.name = name
    17     self.age = age
    18 
    19 Foo =type('Foo',(object,),{'func':func,
    20                            '__init__':__init__})
    21 f =Foo('kanghui',22)
    22 f.func()
    第二种方法

     类是由type类实例化产生的。

    那么类的创建过程是怎样的呢?类中有一个属性 __metaclass__,其用来表示该类由谁来实例化创建

    所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看类创建的过程。

     metaclass 详解文章:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python

     1 #Author:ZhangKanghui
     2 
     3 class MyType(type):
     4     def __init__(self,what,bases=None,dict=None):
     5         print("MyType--------init")
     6         super(MyType,self).__init__(what,bases,dict)
     7     def __call__(self, *args, **kwargs):
     8         print("MyType-------call")
     9         obj = self.__new__(self,*args,**kwargs)
    10         self.__init__(self,*args,**kwargs)
    11 
    12 
    13 class Foo(object):
    14     __metaclass__ = MyType
    15 
    16     def __init__(self,name):
    17         self.name = name
    18         print("Foo-----init")
    19     def __new__(cls, *args, **kwargs):
    20         print("Foo----new")
    21         print(object.__new__(cls))              #通过执行结果们可以看出return的返回值就是Foo的内存地址
    22         return object.__new__(cls)             #继承父类的new方法
    23 
    24 
    25 #看不懂没关系,我们先来实例化一下看看都在干吗
    26 obj =Foo("erha")
    27 #执行结果:先执行new再执行init,这是为什么呢?
    28 # Foo----new
    29 # Foo-----init
    30 
    31 #这个时候我们把new中的return注释掉看一下执行结果。
    32 #Foo----new     只执行了new,根本没有实例化。不信可以试一下  print(obj.name)
    33 #所以new使用来创建实例的
    34 #取消return的注释再执行一下
    35 print(obj.name)
    __new__&__metaclass

    1 静态方法  @staticmethod

    与类无关,不能访问类里的任何变量
    只是名义上归类管理,但实际上静态方法里访问不了类和实例中的任何属性。只是名义上归类管理,但实际上静态方法里访问不了类和实例中的任何属性。

     1 #Author:ZhangKanghui
     2 #先来大概认识一下staticmethod
     3 
     4 class Dog(object):
     5     def __init__(self,name):
     6         self.name = name
     7     @staticmethod           #这就跟类没有什么关系了,下面的这个只是一个貌似属于类的函数
     8     def eat(self,food):
     9         print("%s is eating %s" %(self.name,food))
    10 
    11 d =Dog("二哈")
    12 d.eat("baozi")
    13 
    14 #正常情况下是可以运行的,但是在eat函数上加一个@staticmethod在运行一下看看
    15 #TypeError: eat() missing 1 required positional argument: 'food'
    16 #这就跟类没有什么关系了,下面的这个只是一个貌似属于类的函数
    静态方法
    @staticmethod

    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法

    上面的调用会出错误,说是eat需要一个self参数,但调用时却没有传递。

    没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。

    想让上面的代码可以正常工作有两种办法

    1. 调用时主动传递实例本身给eat方法,即d.eat(d) 

    2. 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了。这就是静态方法。

    1 class Dog(object):
    2     def __init__(self,name):
    3         self.name = name
    4 
    5 @staticmethod
    6 def eat():
    7 print(" is eating")
    8 d = Dog("二哈")
    9 d.eat()
    静态方法
    @staticmethod

    2 类方法  @classmethod                                                                                                                                                                                                 

    只能访问类变量不能访问实例变量。
    如果存在类变量和实例变量相同时,正常情况下会先访问实例变量,然后访问类变量。如果使用类方法则可以强制去访问类变量。

     1 #Author:ZhangKanghui
     2 
     3 class Dog(object):
     4     n = "哈士奇"
     5     def __init__(self,name):
     6         self.name = name
     7     @classmethod           #这就跟类没有什么关系了,下面的这个只是一个貌似属于类的函数
     8     def eat(self,food):
     9         #print("%s is eating %s" %(self.name,food))
    10         print("%s is eating %s" %(self.n,food))
    11 
    12 d =Dog("二哈")
    13 d.eat("baozi")
    14 #这样直接运行会报错  AttributeError: type object 'Dog' has no attribute 'name'
    15 #此时我们在类下面加一个类变量,然后用self.n调用它
    类方法@classmethod

    类方法通过@classmethod装饰器实现

    此时,定义一个类变量执行以下试试看:

     1 class Dog(object):
     2     name = "我是类变量"
     3     def __init__(self,name):
     4         self.name = name
     5  
     6     @classmethod
     7     def eat(self):
     8         print("%s is eating" % self.name)
     9  
    10 d = Dog("二哈")
    11 d.eat()
    12  
    13 
    14 #执行结果
    15  
    16 我是类变量 is eating
    类方法@classmethod

    3 属性方法  @property

    属性方法的作用就是通过@property把一个方法变成一个静态属性

     1 #Author:ZhangKanghui
     2 '''
     3 class Dog(object):
     4     def __init__(self,name):
     5         self.name = name
     6 
     7     @property
     8     def eat(self):
     9         print("%s is eating %s" %(self.name,"baozi"))
    10 
    11 # d =Dog("二哈")
    12 # d.eat
    13 #这样就是属性方法,根据运行结果可以发现能够正常运行但是不能传参了
    14 #那么如果想要传参怎么办呢?
    15 
    16     @eat.setter
    17     def eat(self,food):
    18         print("set to food:",food)
    19 
    20 d =Dog("二哈")
    21 d.eat
    22 d.eat ="roubaozi"
    23 #此时发现虽然给d.eat这个静态方法赋值但是并没有将参数传进去。那怎么做呢?
    24 '''
    25 class Dog(object):
    26     def __init__(self,name):
    27         self.name = name
    28         self.__food = None
    29     @property
    30     def eat(self):
    31         print("%s is eating %s" %(self.name,self.__food))
    32 
    33     @eat.setter
    34     def eat(self,food):
    35         #print("set to food:", food)
    36         self.__food = food
    37 
    38     @eat.deleter
    39     def eat(self):
    40         del self.__food
    41         print("删除了吗")
    42 
    43 d =Dog("二哈")
    44 d.eat
    45 d.eat ="roubaozi"
    46 d.eat
    47 
    48 #那么属性可以删除吗?
    49 #del d.eat          你会发现报错了  删不掉
    50 #如果是真的想删除呢?   再加一个@eat.deleter
    51 del d.eat
    属性方法@property

    综上,写一段代码:航班查询

    1. 连接航空公司API查询

    2. 对查询结果进行解析 

    3. 返回结果给你的用户

     1 #Author:ZhangKanghui
     2 
     3 class Flight(object):
     4     def __init__(self,name):
     5         self.flight_name = name
     6     def checking_status(self):
     7         print("checking flight %s status " % self.flight_name)
     8         return  1
     9     def flight_status(self):
    10         status = self.checking_status()
    11         if status == 0 :
    12             print("flight got canceled...")
    13         elif status == 1 :
    14             print("flight is arrived...")
    15         elif status == 2:
    16             print("flight has departured already...")
    17         else:
    18             print("cannot confirm the flight status...,please check later")
    19 
    20 f = Flight("CA980")
    21 f.flight_status()
    航班查询

    变成属性之后能否赋值呢?当然可以改, 不过需要通过@proerty.setter装饰器再装饰一下。

     1 class Flight(object):
     2     def __init__(self,name):
     3         self.flight_name = name
     4 
     5 
     6     def checking_status(self):
     7         print("checking flight %s status " % self.flight_name)
     8         return  1
     9 
    10 
    11     @property
    12     def flight_status(self):
    13         status = self.checking_status()
    14         if status == 0 :
    15             print("flight got canceled...")
    16         elif status == 1 :
    17             print("flight is arrived...")
    18         elif status == 2:
    19             print("flight has departured already...")
    20         else:
    21             print("cannot confirm the flight status...,please check later")
    22     
    23     @flight_status.setter #修改
    24     def flight_status(self,status):
    25         status_dic = {
    26             0 : "canceled",
    27             1 :"arrived",
    28             2 : "departured"
    29         }
    30         print("33[31;1mHas changed the flight status to 33[0m",status_dic.get(status) )
    31 
    32     @flight_status.deleter  #删除
    33     def flight_status(self):
    34         print("status got removed...")
    35 
    36 f = Flight("CA980")
    37 f.flight_status
    38 f.flight_status =  2 #触发@flight_status.setter 
    39 del f.flight_status #触发@flight_status.deleter 
    航班查询(改进版)

    4 类的特殊成员

      a、__doc__ 表示类的描述信息

    1 #Author:ZhangKanghui
    2 
    3 class Dog(object):
    4     '''这个类是用来描述哈士奇的'''
    5     def __init__(self):
    6        pass
    7 
    8 print(Dog.__doc__)
    __doc__

      b、__module__ 表示当前操作对象在那个模块

      c、__class__ 表示当前操作对象的类是什么

    1 #Author:ZhangKanghui
    2 
    3 class A(object):
    4     def __init__(self):
    5         pass
    lib
     1 #Author:ZhangKanghui
     2 
     3 from lib.empty import A
     4 obj =A()
     5 print(obj.__module__)
     6 print(obj.__class__)
     7 
     8 class Dog(object):
     9     def __init__(self,name):
    10         self.name = name
    11 
    12     def __call__(self, *args, **kwargs):
    13         print("here",args,kwargs)
    14 
    15     def __str__(self):
    16         return ("<obj:%s>"%self.name)
    17 
    18 d =Dog("二哈")
    19 #这样执行没问题,但是这样呢
    20 #d()        TypeError: 'Dog' object is not callable  你会发现d后面还能加括号怎么执行呢?
    21 d(1,2,3,name='erha')
    22 # Dog("二哈")(1,2,3,name='erha')
    23 
    24 # print(Dog.__dict__)         #打印类的所有属性,不包括实例属性
    25 # print(d.__dict__)           #打印所有实例属性,不包括类属性
    26 print(d)
    27 '''有没有这些的区别呢?
    28         def __str__(self):
    29             return ("<obj:%s>" % self.name)
    30 '''
    index
    1 lib.empty
    2 <class 'lib.empty.A'>
    3 here (1, 2, 3) {'name': 'erha'}
    4 <obj:二哈>
    输出结果

      d、__init__ 构造方法,通过类创建对象时,自发触发执行。

      e、__del__ 析构方法,当对象在内存中被释放时,自发触发执行。

      f、__call__ 对象后面加括号触发执行

     1 class Foo:
     2 
     3     def __init__(self):
     4         pass
     5     
     6     def __call__(self, *args, **kwargs):
     7 
     8         print('__call__')
     9 
    10 
    11 obj = Foo() # 执行 __init__
    12 obj()       # 执行 __call__
    __call__

      g、__dict__ 查看类或对象中的所有成员

     1 #Author:ZhangKanghui
     2 
     3 class Province(object):
     4     country = 'China'
     5 
     6     def __init__(self,name,count):
     7         self.name = name
     8         self.count = count
     9 
    10     def func(self,*args,**kwargs):
    11         print(func)
    12 #获取类的成员
    13 print(Province.__dict__)
    14 obj =Province("Henan",1000)
    15 print(obj.__dict__)
    __dict__

      h、__str__ 如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值  改变对象的字符串显示

     1 #Author:ZhangKanghui
     2 class Dog(object):
     3     def __init__(self,name):
     4         self.name = name
     5         self.__food = None
     6     @property
     7     def eat(self):
     8         print("%s is eating %s" %(self.name,self.__food))
     9     def __str__(self):
    10         return "<obj:%s>"% self.name
    11 d = Dog("erha")
    12 print(d)
    13 #如果直接进行实例化打印输出是个内存地址,此时在实例化钱定义__str__
    14 #输出结果分别是:
    15 #<__main__.Dog object at 0x038E42B0>
    16 #<obj:erha>
    __str__

      i、__getitem__  __setitem__  __delitem__  用于索引操作,如字典。以上分别表示获取、设置和删除数据。

     1 #Author:ZhangKanghui
     2 
     3 class Foo(object):
     4     def __init__(self):
     5         self.data ={}
     6 
     7     def __getitem__(self,key):
     8         print("__getitem__", key)
     9         return self.data.get(key)
    10     def __setitem__(self, key, value):
    11         print("__setitem__",key,value)
    12         self.data[key] =value
    13 
    14     def __delitem__(self, key):
    15         print("__delitem__", key)
    16 
    17 obj =Foo()
    18 #这样实例化之后可以像字典一样给实例赋值
    19 obj["name"] ="二哈"
    20 print(obj["name"])
    21 print(obj.data)
    22 #这个时候的输出是一个字典
    23 del obj["name"]
    24 #输出结果__delitem__ name这个只是执行到这一步但是还没有执行
    三合一

    5 反射

    主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。

    通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法

    1 判断object中有没有一个name字符串对应的方法或属性
    hasattr(obj,name)
    def getattr(object, name, default=None): # known special case of getattr
        """
        getattr(object, name[, default]) -> value
    
        Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
        When a default argument is given, it is returned when the attribute doesn't
        exist; without it, an exception is raised in that case.
        """
        pass
    getattr(obj,name)
    def setattr(x, y, v): # real signature unknown; restored from __doc__
        """
        Sets the named attribute on the given object to the specified value.
    
        setattr(x, 'y', v) is equivalent to ``x.y = v''
        """
        pass
    setattr(obj,str,val)
    def delattr(x, y): # real signature unknown; restored from __doc__
        """
        Deletes the named attribute from the given object.
    
        delattr(x, 'y') is equivalent to ``del x.y''
        """
        pass
    delattr(obj,str)

    看完四个方法的定义之后就来看看实战怎么用?

     1 #Author:ZhangKanghui
     2 
     3 def bark(self):
     4     print("%s is aoaoaoao...."% self.name)
     5 
     6 class Dog(object):
     7     def __init__(self,name):
     8         self.name = name
     9 
    10     def eat(self):
    11         print("%s is eating..." %self.name)
    12 
    13 d =Dog("erha")
    14 choice =input(">>:").strip()
    15 '''
    16 #d.choice           #AttributeError: 'Dog' object has no attribute 'choice'
    17 print(hasattr(d,choice))
    18 #hasattr(obj,name_str)   判断一个对象obj里是否有对应的name_str字符串方法
    19 print(getattr(d,choice))
    20 #getattr(obj,name_str)      根据字符串去获取obj对象里对应方法的内存地址
    21 getattr(d,choice)()
    22 '''
    23 #那么实际上我们会怎么写呢?
    24 if hasattr(d,choice):
    25     delattr(d,choice)
    26     #func = getattr(d, choice)
    27     #func("erha")
    28     # print(func)
    29     # setattr(d,choice,"hashiqi")
    30 else:
    31     '''
    32     setattr(d,choice,bark)      #d.choice = bark
    33     #d.bark()           TypeError: bark() missing 1 required positional argument: 'self'
    34     d.talk(d)           #在这里,看清楚是talk不是bark   但和d.bark(d)执行结果一样。这就是动态方法
    35 #为什么talk和bark都是一样的呢?是因为输入的值其实就是choice
    36 '''
    37 #setattr(obj,y,v) is equivalent to    x.y=v
    38 #这是添加了一个动态方法,那么接下来我们给它加一个动态属性.先把上面注释了
    39     setattr(d,choice,None)
    40     v =getattr(d,choice)
    41     print( v )
    42 #方法在返回值时需要加括号,而属性不需要。如果此时我们传入的参数没有,比如age就返回None
    43 #但是如果属性存在呢,比如name  那么他会报错,为什么?因为func是一的属性了不能加括号调用,那么把func()注释了呢
    44 print(d.name)
    45 
    46 #delattr
    反射1
     1 def delattr(x, y): # real signature unknown; restored from __doc__
     2     """
     3     Deletes the named attribute from the given object.
     4 
     5     delattr(x, 'y') is equivalent to ``del x.y''
     6     """
     7     pass
     8 复制代码
     9  
    10 
    11 复制代码
    12 class BlackMedium:
    13     feature='Ugly'
    14     def __init__(self,name,addr):
    15         self.name=name
    16         self.addr=addr
    17 
    18     def sell_house(self):
    19         print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)
    20     def rent_house(self):
    21         print('%s 黑中介租房子啦,傻逼才租呢' %self.name)
    22 
    23 b1=BlackMedium('万成置地','回龙观天露园')
    24 
    25 #检测是否含有某属性
    26 print(hasattr(b1,'name'))
    27 print(hasattr(b1,'sell_house'))
    28 
    29 #获取属性
    30 n=getattr(b1,'name')
    31 print(n)
    32 func=getattr(b1,'rent_house')
    33 func()
    34 
    35 # getattr(b1,'aaaaaaaa') #报错
    36 print(getattr(b1,'aaaaaaaa','不存在啊'))
    37 
    38 #设置属性
    39 setattr(b1,'sb',True)
    40 setattr(b1,'show_name',lambda self:self.name+'sb')
    41 print(b1.__dict__)
    42 print(b1.show_name(b1))
    43 
    44 #删除属性
    45 delattr(b1,'addr')
    46 delattr(b1,'show_name')
    47 delattr(b1,'show_name111')#不存在,则报错
    48 
    49 print(b1.__dict__)
    反射2

    6 异常

     1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
     2 IOError 输入/输出异常;基本上是无法打开文件
     3 ImportError 无法引入模块或包;基本上是路径问题或名称错误
     4 IndentationError 语法错误(的子类) ;代码没有正确对齐
     5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
     6 KeyError 试图访问字典里不存在的键
     7 KeyboardInterrupt Ctrl+C被按下
     8 NameError 使用一个还未被赋予对象的变量
     9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    10 TypeError 传入对象类型与要求的不符合
    11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    12 导致你以为正在访问它
    13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    常用异常
     1 ArithmeticError
     2 AssertionError
     3 AttributeError
     4 BaseException
     5 BufferError
     6 BytesWarning
     7 DeprecationWarning
     8 EnvironmentError
     9 EOFError
    10 Exception
    11 FloatingPointError
    12 FutureWarning
    13 GeneratorExit
    14 ImportError
    15 ImportWarning
    16 IndentationError
    17 IndexError
    18 IOError
    19 KeyboardInterrupt
    20 KeyError
    21 LookupError
    22 MemoryError
    23 NameError
    24 NotImplementedError
    25 OSError
    26 OverflowError
    27 PendingDeprecationWarning
    28 ReferenceError
    29 RuntimeError
    30 RuntimeWarning
    31 StandardError
    32 StopIteration
    33 SyntaxError
    34 SyntaxWarning
    35 SystemError
    36 SystemExit
    37 TabError
    38 TypeError
    39 UnboundLocalError
    40 UnicodeDecodeError
    41 UnicodeEncodeError
    42 UnicodeError
    43 UnicodeTranslateError
    44 UnicodeWarning
    45 UserWarning
    46 ValueError
    47 Warning
    48 ZeroDivisionError
    更多异常

    来看看实例:KeyError  IndexError  ValueError

     1 #Author:ZhangKanghui
     2 '''
     3 while True:
     4     num1 = input('num1:')
     5     num2 = input('num2:')
     6 
     7     try:
     8         num1 = int(num1)
     9         num2 = int(num2)
    10         result = num1 + num2
    11     except Exception as e:
    12         print('出现异常,信息如下:')
    13         print(e)
    14 '''
    15 #IndexError
    16 dic = ["wupeiqi", 'alex']
    17 try:
    18     dic[10]
    19 except IndexError as e:
    20     print(e)
    21 
    22 #KeyError
    23 dic = {'k1':'v1'}
    24 try:
    25     dic['k20']
    26 except KeyError as e:
    27     print(e)
    28 
    29 #ValueError
    30 s1 = 'hello'
    31 try:
    32     int(s1)
    33 except ValueError as e:
    34     print(e)
    35 
    36 #万能异常Exception、
    37 s1 = 'hello'
    38 try:
    39     int(s1)
    40 except Exception as e:
    41     print(e)
    实例
     1 #Author:ZhangKanghui
     2 
     3 try:
     4     #open(csv.xml)
     5     a = 1
     6     print(a)
     7 except (IndexError,KeyError) as e:
     8     print("Not Found 404",e)
     9 except ValueError as e:
    10     print("Not Found 101",e)
    11 except Exception as e:
    12     print("Unkown Error",e)
    13 
    14 else:
    15     print("No Problem")
    16 
    17 finally:
    18     print("不管有没有错,都会执行")
    异常的其他结构

    当然,我们也可以自定义异常,通过raise来触发。

     1 #Author:ZhangKanghui
     2 
     3 class MiracleException(Exception):
     4     def __init__(self, msg):
     5         self.message = msg
     6     # def __str__(self):
     7     #     return self.message
     8     #上面这两句注释了也不会出问题。
     9 #主动出发异常
    10 try:
    11     raise MiracleException('你不能这么做')
    12 except MiracleException as e:
    13     print(e)
    自定义异常

    7 动态导入模块

     1 #Author:ZhangKanghui
     2 
     3 mod = __import__("lib.empty")       #lib
     4 #mod = __import__("lib")       #这样只能找到lib这一层
     5 
     6 print(mod)
     7 #<module 'lib' from 'C:\Users\miraacle\PycharmProjects\s\day7\lib\__init__.py'>
     8 print(mod.empty)
     9 #<module 'lib.empty' from 'C:\Users\miraacle\PycharmProjects\s\day7\lib\empty.py'>
    10 print(mod.empty.A)
    11 #<class 'lib.empty.A'>
    12 
    13 obj = mod.empty.A("erha")
    14 print(obj.name)
    form module import ...
    1 import importlib
    2 mod = importlib.import_module("lib.empty")      #这个是写到哪一层就是哪一层
    3 print(mod)
    4 print(mod.A)
    5 print(mod.A("erha"))
    6 print(mod.A("erha").name)
    importlib

    此外,还有一个拿来装比的  assert  断言

    如果接下来的程序依赖于一个什么条件的情况下可以考虑用断言。这个必须正确才能继续往下进行。

    1 import importlib
    2 mod = importlib.import_module("lib.empty")      #这个是写到哪一层就是哪一层
    3 obj = mod.A("erha")
    4 assert type(obj.name) is str
    5 print("我的断言屌不屌")
    断言assert

    8 小结

    感觉自己走进了知识的海洋,然后溺水了!

    要学的东西太多了。

    慢慢来~厚积薄发

    9 练习

    其实,没有练习。

    但是我还是放一个决策树算法的吧~

     1 #Author:ZhangKanghui
     2 
     3 from sklearn.feature_extraction import DictVectorizer
     4 import csv
     5 from sklearn import tree
     6 from sklearn import preprocessing
     7 from sklearn.externals.six import StringIO
     8 
     9 # Read in the csv file and put features into list of dict and list of class label
    10 allElectronicsData = open(r'/home/zhoumiao/MachineLearning/01decisiontree/AllElectronics.csv', 'rb')
    11 reader = csv.reader(allElectronicsData)
    12 headers = reader.next()
    13 
    14 print(headers)
    15 
    16 featureList = []
    17 labelList = []
    18 
    19 for row in reader:
    20     labelList.append(row[len(row)-1])
    21     rowDict = {}
    22     for i in range(1, len(row)-1):
    23         rowDict[headers[i]] = row[i]
    24     featureList.append(rowDict)
    25 
    26 print(featureList)
    27 
    28 # Vetorize features
    29 vec = DictVectorizer()
    30 dummyX = vec.fit_transform(featureList) .toarray()
    31 
    32 print("dummyX: " + str(dummyX))
    33 print(vec.get_feature_names())
    34 
    35 print("labelList: " + str(labelList))
    36 
    37 # vectorize class labels
    38 lb = preprocessing.LabelBinarizer()
    39 dummyY = lb.fit_transform(labelList)
    40 print("dummyY: " + str(dummyY))
    41 
    42 # Using decision tree for classification
    43 # clf = tree.DecisionTreeClassifier()
    44 clf = tree.DecisionTreeClassifier(criterion='entropy')
    45 clf = clf.fit(dummyX, dummyY)
    46 print("clf: " + str(clf))
    47 
    48 
    49 # Visualize model
    50 with open("allElectronicInformationGainOri.dot", 'w') as f:
    51     f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)
    52 
    53 oneRowX = dummyX[0, :]
    54 print("oneRowX: " + str(oneRowX))
    55 
    56 newRowX = oneRowX
    57 newRowX[0] = 1
    58 newRowX[2] = 0
    59 print("newRowX: " + str(newRowX))
    60 
    61 predictedY = clf.predict(newRowX)
    62 print("predictedY: " + str(predictedY))
    KNN实例应用

    使用scikit-learn,需要安装sklearn模块才能用!

    文档: http://scikit-learn.org/stable/modules/tree.html

    我是尾巴~

    这次是一个可视化工具:graphviz

    安装Graphviz: http://www.graphviz.org/

     转化dot文件至pdf可视化决策树:dot -Tpdf iris.dot -o outpu.pdf

    虽不才~才要坚持

  • 相关阅读:
    阿里云应用开发
    [New Portal]Windows Azure Virtual Machine (7) 删除Virtual Machine
    Windows Azure Affinity Groups (2) 创建Windows Azure Affinity Groups 地缘组
    [New Portal]Windows Azure Virtual Machine (8) Virtual Machine高可用(上)
    [New Portal]Windows Azure Virtual Machine (6) 指定Virtual Machine存储账户
    [New Portal]Windows Azure Storage (13) 本地冗余存储 vs 地理冗余存储 (下)
    [New Portal]Windows Azure Virtual Machine (9) Virtual Machine高可用与自动负载均衡(下)
    树控件的整理
    很好用的数据恢复软件
    JS日历控件
  • 原文地址:https://www.cnblogs.com/zhangkanghui/p/9539709.html
Copyright © 2020-2023  润新知