@classmetod
#!/usr/bin/env python # -*- coding:utf-8 -*- class Animal: def __init__(self,name): self.name = name hobbie = 'meat' @classmethod #类方法不能访问实例变量 加上后 self.name就无法访问了 def talk(self): #print("%s is talking" %self.name) print("%s is talking" %self.hobbie) Animal.hobbie Animal.talk() d = Animal("wangwang") d.talk()
@staticmethon
#!/usr/bin/env python # -*- coding:utf-8 -*- class Animal: def __init__(self,name): self.name = name hobbie = 'meat' ''' @classmethod #类方法不能访问实例变量 self.name就无法访问了 def talk(self): #print("%s is talking" %self.name) print("%s is talking" %self.hobbie) ''' @staticmethod #静态方法,跟事例没有任何关系了,实例变量和类变量都无法访问了, def walk(): print("is walking..." ) #Animal.hobbie #Animal.talk() d = Animal("wangwang") d.walk()
@property
#!/usr/bin/env python # -*- coding:utf-8 -*- class Animal: def __init__(self,name): self.name = name self.num = None hobbie = 'meat' ''' @classmethod #类方法不能访问实例变量 self.name就无法访问了 def talk(self): #print("%s is talking" %self.name) print("%s is talking" %self.hobbie) @staticmethod #静态方法,跟事例没有任何关系了,实例变量和类变量都无法访问了, def walk(): print("is walking..." ) ''' @property #加了property后babit就不是方法了,调用时不用加括号,是属性。把方法变成属性,类变量实例变量还可以访问。不能传值了。如果非要传值看下面的例子,删除也在下面 def habit(self): print("[%s] habit is xxoo" %self.name) #往里面传值 @property def total_players(self): return self.num @total_players.setter def total_players(self,num): self.num = num print("total players:",self.num) #删值 @total_players.deleter def total_players(self): print("total player got delted") del self.num #Animal.hobbie #Animal.talk() # d = Animal("wangwang") # d.walk() d = Animal("WangWang") d.habit print(d.total_players) d.total_players = 3 del d.total_players print(d.total_players)
私有变量(私有属性)) 外部无法访问,如果特殊情况下非要访问也是可以的
print("OUT__Num:",d.__num)改成 print("OUT__Num:",d._Animal__num)
#!/usr/bin/env python # -*- coding:utf-8 -*- class Animal: def __init__(self,name): self.name = name self.__num = None hobbie = 'meat' ''' @classmethod #类方法不能访问实例变量 self.name就无法访问了 def talk(self): #print("%s is talking" %self.name) print("%s is talking" %self.hobbie) @staticmethod #静态方法,跟事例没有任何关系了,实例变量和类变量都无法访问了, def walk(): print("is walking..." ) ''' @property #加了property 后babit就不是方法了,是属性。把方法变成属性,类变量实例变量还可以访问。不能传值了。如果非要传值看下面的例子,删除也在下面 def habit(self): print("[%s] habit is xxoo" %self.name) #往里面传值 @property def total_players(self): return self.__num @total_players.setter def total_players(self,num): self.__num = num print("total players:",self.__num) #删值 @total_players.deleter def total_players(self): print("total player got delted") del self.num #Animal.hobbie #Animal.talk() # d = Animal("wangwang") # d.walk() d = Animal("WangWang") d.habit print(d.total_players) d.total_players = 3 d.__num = 9 print("OUT__Num:",d.__num) #del d.total_players print(d.total_players)
多继承 经典类和新式类的区别
#!/usr/bin/env python # -*- coding:utf-8 -*- # B > C > A 广度优先 从同一级从左到右以此查找,然后再去上一级 新式类 # B > A > C 深度有先 经典类 #新式类和经典类 区别在于 py2 和py3 的区别,同样的代码用2.7的就成了深度优先 class A: #经典类 #class A(object): #新式类 n = "A" def f2(self): print("AF2") class B(A): n = "B" def f1(self): print("B") def f2(self): print("B2") class C(A): n = "C" def f2(self): print("C") class D(B,C): pass d = D() #d.f1() d.f2() #面向对象特性之多态 ''' __doc__ 显示类的解释注释 __del__ 析构方法 等程序执行结束后统一销毁 __call__ 实例化加()自动执行call方法 无卵用 __new__ 把类重写, new调用了init 暂时无用 __dict__ 类的成员变量以字典形式显示出来 '''