1 class Animal(object): 2 name = "hello" 3 4 def __init__(self, name): 5 self.name = name 6 self.__num = 100 7 8 @classmethod # 类方法,只能访问类属性,不能调用实例属性 9 def talk(self): 10 print("%s talk wang" % self.name) 11 12 def walk(self): 13 print("%s walking now" % self.name) 14 15 @staticmethod # 静态方法,不能直接访问类属性,以及实例属性 16 def habbit(self): 17 print(" %s habbit ..." % self.name) 18 19 @property # 属性,将类方法变成类属性形式对外提供访问 20 def total(self): 21 print("total pro is %s" % self.__num) 22 23 @property 24 def total_num(self): 25 print("total num pro is %s" % self.__num) 26 27 @total_num.setter 28 def total_num(self, num): # 静态属性修改值,如果要修改,则必须传入一个参数 29 self.__num = num 30 print("total num set is %s" % self.__num) 31 32 @total_num.deleter 33 def total_num(self): 34 print("total num del is %s" % self.__num) 35 del self.__num 36 37 newdog = Animal("san") 38 newdog.talk() 39 newdog.walk() 40 newdog.habbit(newdog) 41 print(newdog._Animal__num) 42 newdog.total 43 newdog.total_num 44 newdog.total_num = 3 45 del newdog.total_num 46 newdog.total_num # 已经删除了该实例属性,所以不存在了,报错
类的继承
1 class A: 2 def f1(self): 3 print("from A") 4 5 class B(A): 6 def f1(self): 7 print("from B") 8 9 class C(A): 10 def f1(self): 11 print("from C") 12 13 class D(B, C): 14 def f3(self): 15 print("from d") 16 17 def f2(self): 18 print("from D") 19 20 21 m = D() 22 m.f1() 23 24 #3.x时经典类和新式类都是默认广度优先 25 #2.x 时,新式类使用广度优先,经典类使用深度优先
1 class Foo: 2 """ 3 hello, 4 这里的代码通过类名.__doc__()可以获取到 5 """ 6 7 def __init__(self): # 构造方法,通过创建对象时.自动触发执行 8 print("__init") 9 # 静态字段 10 11 def __del__(self): #析构方法,当对象在内存中被释放时自动触发执行 12 pass 13 14 def __new__(cls, *args, **kwargs): 15 pass 16 17 def __call__(self, *args, **kwargs): # 创建的对象加括号后,触发执行 18 # 构造方法的执行是由创建对象触发的,即:对象 = 类名();call方法的执行是由对象加括号触发的,即对象()或者类()() 19 pass 20 21 def __str__(self): # 当一个类中定义了__str__方法,则在打印对象时,默认输出该返回值 22 return "zengchunyun" 23 24 def __getitem__(self, item): 25 pass # 用于索引操作.如字典,这个方法主要用来获取数据 26 27 def __setitem__(self, key, value): 28 pass 29 # 用于对索引对设置 30 31 def __delitem__(self, key): 32 pass 33 # 用于删除索引的数据 34 35 def __iter__(self): 36 pass # 用于迭代器,之所以列表,字典,元组可以进行FOR循环,是因为定义了该方法 37 38 def __metaclass__(self): 39 pass 40 # 41 42 43 44 45 a = Foo() 46 a.__doc__ 47 # print(a.__module__) # 表示当前操作的对象在哪个模块,仅限在另一个文件调用时才有该属性 48 print(a.__class__) # 输出"NoneType 即当前操作的对象的类是什么 49 50 #获取类成员 51 class MM(object): 52 def __init__(self): 53 self.hello = None 54 def say(self): 55 pass 56 print(MM.__dict__) # 获取类成员 57 obj = MM() 58 print(obj.__dict__) # 获取对象成员 59 60 class Foo(object): 61 def __init__(self): 62 pass 63 64 obj = Foo() # obj 是Foo类实例化的对象 65 print(type(obj)) # obj对由Foo类创建 66 print(type(Foo)) #Foo类对象由type类创建 67 68 #创建类的两种方式 69 # 第一种就是上面这种 70 # 第二种就是type类的构造函数 71 def func(self): 72 print("hello") 73 74 Foo = type("Foo",(object,), {"func":func}) 75 #type第一个参数为 类名 76 # type第二个参数为当前类的基类 77 # type第三个参数为类的成员