• 面向对象——静态方法、类方法、属性法法,其他特殊方法


    静态方法

    定义了静态方法@staticmethod就与类没什么关联,只是名义上仍旧归属类,实际上在静态方法里访问不了类或实例中的任何属性。调用静态方法或者属性可通过类名.函数名(属性名)调用,具体实现如下:

    未定义静态方法前:

     1 class Dog(object):
     2     def __init__(self,name):
     3         self.name = name
     4 
     5     def eat(self, food):
     6 
     7         print("%s eating %s"%(self.name, food))
     8 
     9 d = Dog("hh")
    10 d.eat("baozi")

    定义静态方法后:

     1 class Dog(object):
     2     def __init__(self, name):
     3         self.name = name
     4 
     5     @staticmethod
     6     def eat(food):
     7         print("%s eating %s"%("hh", food))
     8 
     9 d = Dog("hh")
    10 d.eat("baozi")

    若非要给静态方法传递参数进去,可将实例化后的实例对象传递进去

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @staticmethod
        def eat(self, food):
            print("%s eating %s"%(self.name, food))
    
    d = Dog("hh")
    d.eat(d,"baozi")  # 将d实例对象传递给self,原先self就是指实例本身的

    类方法

    类方法只能访问类变量,无法访问实例变量

     1 class Dog(object):
     2     name = 'YI' # 类变量
     3     def __init__(self, name):
     4         self.name = name
     5 
     6     # @staticmethod
     7     @classmethod
     8     def eat(self, food):
     9         print("%s eating %s"%(self.name, food))
    10 
    11 d = Dog("hh")
    12 d.eat("baozi")
    13 
    14 结果:
    15 YI eating baozi

    属性方法

    把一个方法变成一个静态属性,若想给属性名赋值,需重新定义一个方法 将属性传给方法

     1 class Dog(object):
     2     name = 'YI' # 类变量
     3     def __init__(self, name):
     4         self.name = name
     5 
     6  
     7     @property  # 属性方法
     8     def eat(self):
     9         print("%s eating %s"%(self.name, "baozi"))
    10 
    11 d = Dog("hh")
    12 d.eat

     若想给属性名赋值,需重新定义一个方法 将属性传给方法

     1 class Dog(object):
     2     name = 'YI' # 类变量
     3     def __init__(self, name):
     4         self.name = name
     5 
     6     # @staticmethod
     7     # @classmethod
     8     @property
     9     def eat(self):
    10         print("%s eating %s"%(self.name,"baozi"))
    11     @eat.setter
    12     def eat(self, food):
    13         print("sed to food:", food)
    14 
    15 d = Dog("hh")
    16 d.eat  # 定义了属性方法已将方法变成静态属性
    17 d.eat = "HHH"
    18 
    19 结果:
    20 hh eating baozi
    21 sed to food: HHH

    上面仍是没有把值传进去

    class Dog(object):
        name = 'YI' # 类变量
        def __init__(self, name):
            self.name = name
            self.__food = None
    
        # @staticmethod
        # @classmethod
        @property
        def eat(self):
            print("%s eating %s"%(self.name,self.__food))
    
        @eat.setter
        def eat(self, food):
            print("sed to food:", food)
            self.__food = food
    
    d = Dog("hh")
    d.eat  # 定义了属性方法已将方法变成静态属性
    d.eat = "HHH"
    d.eat  #这个是将“HHH”赋值
    
    结果:
    hh eating None
    sed to food: HHH
    hh eating HHH

    将属性方法变量删除

    class Dog(object):
        name = 'YI' # 类变量
        def __init__(self, name):
            self.name = name
            self.__food = None
    
        # @staticmethod
        # @classmethod
        @property
        def eat(self):
            print("%s eating %s"%(self.name,self.__food))
    
        @eat.setter
        def eat(self, food):
            print("sed to food:", food)
            self.__food = food
        @eat.deleter
        def eat(self):
            del self.__food
            print("food 变量已删除")
    
    d = Dog("hh")
    d.eat  # 定义了属性方法已将方法变成静态属性
    d.eat = "HHH"
    d.eat  #这个是将“HHH”赋值

     类的其他特殊方法

    1、Dog.__doc__    查看类的功能描述信息

     1 class Dog(object):
     2     '''定义dog类'''
     3     name = 'YI' # 类变量
     4     def __init__(self, name):
     5         self.name = name
     6         self.__food = None
     7 print(Dog.__doc__)  # 直接输出这个类的功能
     8 
     9 结果:
    10 定义dog类

    2、__module__和__class__

    __module__ 指的是当前操作对象所在的模块

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

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

    class Dog(object):
        '''定义dog类'''
        name = 'YI' # 类变量
        def __init__(self, name):
            self.name = name
            self.__food = None
    
        def __call__(self, *args, **kwargs):
            print("running call", args, kwargs)
    
    d = Dog("jj")(1,2,3, num = 22)
    
    或者
    
    d = Dog("jj")  
    d(1,2,3, num = 22)
    
    结果:
    running call (1, 2, 3) {'num': 22}

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

     5、__del__

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

    注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,

    所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

    6、__dict__

    1) 直接调用为给类进行实例化,通过类去调用    打印类里所有属性和方法,不包括实例属性

     1 class Dog(object):
     2     '''定义dog类'''
     3     name = 'YI' # 类变量
     4     def __init__(self, name):
     5         self.name = name
     6         self.__food = None
     7 
     8     def __call__(self, *args, **kwargs):
     9         print("running call", args, kwargs)
    10 
    11     def eat(self):
    12         print("%s eating %s"%(self.name,self.__food))
    13 
    14     def eat(self, food):
    15         print("sed to food:", food)
    16         self.__food = food
    17 
    18     def eat(self):
    19         del self.__food
    20         print("food 变量已删除")
    21 print(Dog.__dict__)  # 打印出类里的所有属性和方法

    22 结果: 23 {'__doc__': '定义dog类', 'eat': <function Dog.eat at 0x00586078>, '__init__': <function Dog.__init__ at 0x001C5660>, '__dict__': <attribute '__dict__' of 'Dog' objects>, '__module__': '__main__', '__call__': <function Dog.__call__ at 0x00586150>, 'name': 'YI', '__weakref__': <attribute '__weakref__' of 'Dog' objects>}

    2)通过实例名,打印出实例属性,不包括类属性

     1 class Dog(object):
     2     '''定义dog类'''
     3     name = 'YI' # 类变量
     4     def __init__(self, name):
     5         self.name = name
     6         self.__food = None
     7 
     8     def __call__(self, *args, **kwargs):
     9         print("running call", args, kwargs)
    10 
    11     def eat(self):
    12         print("%s eating %s"%(self.name,self.__food))
    13 
    14     def eat(self, food):
    15         print("sed to food:", food)
    16         self.__food = food
    17 
    18     def eat(self):
    19         del self.__food
    20         print("food 变量已删除")
    21 d = Dog("kk")
    22 print(d.__dict__)  # 实例名.__dict__打印出实例属性,不包括类属性
    23 
    24 结果:
    25 {'_Dog__food': None, 'name': 'kk'}

    7、__str__  如果一个类中定义了__str__方法,那么在打印 对象 时,输出该方法的返回值

     1 class Dog(object):
     2     '''定义dog类'''
     3     name = 'YI' # 类变量
     4     def __init__(self, name):
     5         self.name = name
     6         self.__food = None
     7 
     8     def __call__(self, *args, **kwargs):
     9         print("running call", args, kwargs)
    10 
    11     def eat(self):
    12         print("%s eating %s"%(self.name,self.__food))
    13 
    14     def eat(self, food):
    15         print("sed to food:", food)
    16         self.__food = food
    17 
    18     def eat(self):
    19         del self.__food
    20         print("food 变量已删除")
    21 
    22     def __str__(self):
    23         return "obj:%s"%self.name
    24 d = Dog("kk")
    25 print(d)  # 在打印 对象 时,输出该方法的返回值
    26 
    27 结果:
    28 obj:kk
  • 相关阅读:
    nyoj 409——郁闷的C小加(三)——————【中缀式化前缀后缀并求值】
    中缀表达式转后缀表达式和前缀表达式
    Zoj 3870——Team Formation——————【技巧,规律】
    BNU4286——Adjacent Bit Counts——————【dp】
    BNU7538——Clickomania——————【区间dp】
    BNU4299——God Save the i-th Queen——————【皇后攻击,找到对应关系压缩空间】
    HDU 2795——Billboard——————【单点更新、求最小位置】
    HDU 4027—— Can you answer these queries?——————【线段树区间开方,区间求和】
    BNU34067——Pair——————【找规律】
    telnet 命令使用方法详解
  • 原文地址:https://www.cnblogs.com/wengxq/p/7455370.html
Copyright © 2020-2023  润新知