向日葵223

导航

 

静态方法

定义了静态方法@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

 

posted on 2017-12-23 11:09  向日葵223  阅读(1166)  评论(0编辑  收藏  举报