python之路——第三块(面向对象进阶)
静态方法
@staticmethod ------> 截断跟类的关联,变成一个函数方法
但是需要类实例化后才能调用这个方法,可以用于导入其他模块的功能,构成工具包
class blackperson(person): def __init__(self,name,job,love,speed,animals_obj): super(blackperson, self).__init__(name,job,love) self.animals = animals_obj # person.__init__(self,name,job,love) self.speed = speed def run(self): print(self.name,"run %s"%self.speed) @staticmethod #静态方法 def work(name): print("%s is working now"%name) d2 = blackperson("dzk","st","zm","200",1) d2.work("alex")
类方法
@classmethod
只能访问类变量,不能访问实例变量
class blackperson(person): def __init__(self,name,job,love,speed,animals_obj): super(blackperson, self).__init__(name,job,love) self.animals = animals_obj # person.__init__(self,name,job,love) self.speed = speed @classmethod def run(self): print(self.name,"run %s"%self.speed) @staticmethod #静态方法 def work(name): print("%s is working now"%name) d2 = blackperson("dzk","st","zm","200",1) d2.run()
加上类方法后,调用会报错,但定义了两个类变量,就能正常执行。类方法不能调用构造函数的属性,只能调用公有属性。
name = "alex" speed = 1
属性方法
@property
把一个方法变成静态属性,不能直接传参数,可以用@xxx.setter重新写一个方法用来对变成静态属性后赋值操作。而且不能del删除,只能用@xxx.delter来删除
class person(object): def __init__(self,name,job,love): #构造函数,构造方式,初始化方法 self.name = name self.job = job self.love = love @property def say(self): print("您好,",self.name) def game(self): print(self.name,"is playing game") def marry(self): print("%s married with %s"%(self.name,self.love)) d1 = person("dzk","st","lyf") d1.say
调用的时候如果加括号会报错,因为是已经变成了静态属性,所以不用加括号,直接调用。
_doc_ 打印类的描述信息,即类的注释信息
_module_ 输出对象调用的模块
_dic_ 以字典形式打印类下的信息
_del_ 析构方法,当对象在内存中被释放时,自动触发执行。
反射 ------>hasattr(),getattr(),setattr(),delattr() 四个方法
hasattr(d,choice) , d是实例后的对象,choice是方法的代词,用于查询类中是否有choice这个方法
class person(object): def __init__(self,name,job,love): #构造函数,构造方式,初始化方法 self.name = name self.job = job self.love = love def say(self): a = 1 print("您好,",self.name) print(a) def game(self): print(self.name,"is playing game") def marry(self): print("%s married with %s"%(self.name,self.love)) p1 = person("dzk","st","lyf") choice = input(">>>>>") hasattr(p1,choice) print(hasattr(p1,choice))
如果输入的是say,返回True
getattr(d,choice) 如果方法存在,调用choice这个方法
class person(object): def __init__(self,name,job,love): #构造函数,构造方式,初始化方法 self.name = name self.job = job self.love = love def say(self): a = 1 print("您好,",self.name) print(a) def game(self): print(self.name,"is playing game") def marry(self): print("%s married with %s"%(self.name,self.love)) p1 = person("dzk","st","lyf") choice = input(">>>>>") hasattr(p1,choice) print(hasattr(p1,choice)) getattr(p1,choice)()
调用的时候,直接在gerattr()后再加一个括号即可,如果方法不存在,报错
setattr(x,y,z) x:对象,y:字符串 , z:方法 动态的将z方法装配进类中,可添加静态属性
setattr(p1,"age","22") setattr(p1,"math",lambda num: num + 1) # print(getattr(p1,choice)) print(getattr(p1,choice)(2))
第一个是设置一个静态属性,age = 22
第二个是设置一个新的方法,并用getattr()调用