zoukankan      html  css  js  c++  java
  • python学习之路-day7

    本节内容:

    • 面向对象高级语法部分
      • 静态方法、类方法、属性方法
      • 类的特殊方法
      • 反射
    • 异常处理
    • Socket开发基础

    面向对象高级语法部分

    静态方法                                                                                                                                

    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

     1 class Dog(object):
     2     def __init__(self,name):
     3         self.name = name
     4     
     5     def eat(self):
     6         print("%s is eating" % self.name)
     7 d = Dog("abc")
     8 d.eat()
     9 输出:
    10 abc is eating
    11 
    12 静态方法:
    13 class Dog(object):
    14     def __init__(self,name):
    15         self.name = name
    16     @staticmethod  #把eat方法变为静态方法
    17     def eat(self):
    18         print("%s is eating" % self.name)
    19 d = Dog("abc")
    20 d.eat()
    21 输出:
    22 上面的调用会出以下错误,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。
    23 <span style="color: rgb(255, 0, 0);">Traceback (most recent call last):
    24 
    25   File "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/静态方法.py", line 17, in <module>
    26 
    27     d.eat()
    28 
    29 TypeError: eat() missing 1 required positional argument: 'self'
    30 
    31 </span> 
    View Code

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

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

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

    class Dog(object):
        def __init__(self,name):
            self.name = name
        @staticmethod  #把eat方法变为静态方法
        def eat(self):
            print("%s is eating" % self.name)
    d = Dog("abc")
    d.eat(d)

    类方法                                                                                                        

    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

    class Dog(object):
    
        name = "我是类变量"    #类变量
    
        def __init__(self,name):
    
            self.name = name
    
     
    
        @classmethod
    
        def eat(self):
    
            print("%s is eating" % self.name)
    
     
    d = Dog("abc")   #实例变量
    
    d.eat()
    
    #执行结果
    
    
    我是类变量 is eating

    类的特殊成员方法                                                              

    1. __doc__  表示类的描述信息

     1 class Foo:
     2 
     3     """ 描述类信息"""
     4 
     5  
     6     def func(self):
     7 
     8         pass
     9 
    10 
    11 print Foo.__doc__
    12 
    13 #输出:类的描述信息

    2. __module__ 和  __class__ 

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

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

    1 class C:
    2 
    3     def __init__(self):
    4         self.name = 'lw'
    from lib.aa import C
    
    obj = C()
    print obj.__module__  # 输出 lib.aa,即:输出模块
    print obj.__class__      # 输出 lib.aa.C,即:输出类
    View Code

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

    见day6

    4.__del__

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

    注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

     5. __call__ 对象后面加括号,触发执行。

    注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

     1 class Foo:
     2 
     3  
     4 
     5     def __init__(self):
     6 
     7         pass
     8 
     9      
    10 
    11     def __call__(self, *args, **kwargs):
    12 
    13  
    14 
    15         print '__call__'
    16 
    17  
    18 
    19 obj = Foo() # 执行 __init__
    20 
    21 obj()       # 执行 __call__

    反射                                                

    反射:字符串反射成内存地址,内存地址反射成字符串

    hasattr(d,choice)    #判断一个对象obj里是否有对应的name_str字符串的方法
    getattr(d,choice)    #根据字符串去获取obi对象里的

    setattr(obj,’y’,z)# x.y=z

    delattr(x,y)

     1 # __author__ = 'lw'
     2 def dulk():
     3     print("%s is ...")
     4 class Dog(object):
     5     def __init__(self,name):
     6         self.name = name
     7     def eat(self):
     8         print("%s is eating..." %self.name)
     9 d = Dog("niuhanyang")
    10 choice = input(">>:").strip()    #输入的是Dog这个类里面的方法---->eat
    11 if hasattr(d,choice):            #判断choice(输入的)字符串在d(类)里面是否存在
    12     #print(getattr(d,choice))      #获取方法并打印
    13     getattr(d,choice)()           #获取方法并执行
    14 else:
    15     setattr(d,choice,dulk)            #d.choice = dulk的内存地址
    16     fun = getattr(d,choice)
    17     fun()
    View Code
  • 相关阅读:
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Path Sum
    Symmetric Tree
    Solve Tree Problems Recursively
    632. Smallest Range(priority_queue)
    609. Find Duplicate File in System
    poj3159最短路spfa+邻接表
  • 原文地址:https://www.cnblogs.com/liang-wei/p/5853863.html
Copyright © 2011-2022 走看看