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