Python 面向对象编程进阶
1. 面向对象高级语法
1.1 静态方法
- 静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
- 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
class Dog(object): def __init__(self,name): self.name = name @staticmethod # 普通函数,实际上跟类没什么关系了 def eat(self): print("%s is eating %s" %(self.name,"骨头")) d = Dog("狗") d.eat(d)
1.2 类方法
- 类方法:通过@classmethod装饰器实现,类方法和普通方法的区别是: 类方法只能访问类变量,不能访问实例变量
class Dog(object): n = "狗" # 类变量 def __init__(self,name): self.name = name # 实例变量 #@classmethod # 类方法只能访问类变量 @classmethod def eat(self): print("%s is eating %s" %(self.n,"骨头")) # 会报错不能访问实例变量 # print("%s is eating %s" %(self.name,"骨头")) def talk(self): print("%s is talking" %self.name) d = Dog("泰迪") d.eat()
1.3 属性方法
- 属性方法:作用就是通过@property把一个方法变成一个静态属性。
- 属性方法不能传参,可以赋值。
- 通过@property把 eat(self) 方法变成静态属性。
- 再写一个eat方法,通过 @方法名.setter(@eat.setter)的方式赋值
- @eat.setter 赋值
- @eat.getter 获取
- @eat.deleter 删除
class Dog(object): def __init__(self,name): self.name = name self.__food = None @property # 静态属性 def eat(self): print("%s is eating %s" %(self.name,self.__food)) @eat.setter # 静态属性赋值,需要再写一个eat方法 def eat(self,food): print("set to food:",food) self.__food = food @eat.deleter # 静态属性删除方法。 def eat(self): del self.__food print("删完了") def talk(self): print("%s is talking" %self.name) d = Dog("狗") d.eat # 赋值 d.eat="骨头" d.eat # 删除属性 del d.eat
2. 类的特殊成员方法
2.1 __doc__
- __doc__ 类的描述信息
class Foo: """ 描述类信息""" def func(self): pass print (Foo.__doc__) #输出:描述类信息
5.2 __module__ 和 __class__
- __module__ 表示当前操作的对象在那个模块
- __class__ 表示当前操作的对象的类是什么
a类:
class c: def __init__(self): self.name = "C"
b类:
from a import c obj = c() print(obj.__module__) # 输出:a,输出模块 print(obj.__class__) # 输出:<class 'a.c'>,输出类
2.3 __init__
- __init__ 构造方法,通过类创建对象时,自动触发执行。
class Student(): def __init__(self): self.name = "jack" self.age = 18 def info(self): print(f"{self.name}今年{self.age}岁了") stu = Student() stu.info()
接受外部传参
class Student(): def __init__(self,name,age): self.name = name self.age = age def info(self): print(f"{self.name}今年{self.age}岁了") stu = Student("Jack",18) stu.info()
2.4 __del__
- 析构方法,当对象在内存中被释放时,自动触发执行。
class Foo: def __del__(self): print(f'{self}对象已被释放') obj = Foo()
2.5 __call__
- 对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class A: def __init__(self): self.name = "C" def __call__(self, *args, **kwargs): print("running call",args,kwargs) a = A() # 运行 call A()() # 运行 call a(1,2,3,name="Tom")
2.6 __dict__
- __dict__ 查看类或对象中的所有成员
print(Dog.__dict__) #打印类里的所有属性,不包括实例变量 print(d.__dict__) #打印类里的实例变量,不包括类属性
class Dog(object): '''sadf asdf ''' n = 333 def __init__(self,name): self.name = name self.__food = None #@staticmethod #实际上跟类没什么关系了 #@classmethod @property #@attribute def eat(self): print("%s is eating %s" %(self.name,self.__food)) @eat.setter def eat(self,food): print("set to food:",food) self.__food = food @eat.deleter def eat(self): del self.__food print("删完了") def talk(self): print("%s is talking" %self.name) d = Dog("aa") print(Dog.__dict__) print(d.__dict__) #输出 {'__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, 'n': 333, '__doc__': 'sadf asdf ', '__module__': '__main__', '__init__': <function Dog.__init__ at 0x006AE300>, 'talk': <function Dog.talk at 0x006AE390>, 'eat': <property object at 0x006A6F90>} #输出 {'name': 'aa', '_Dog__food': None}
2.7 __str__
- 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出str方法的返回值。
class Foo: def __str__(self): return '返回值' obj = Foo() print(obj) # 输出:返回值
print(obj) # 如果不写 __str__ 返回 obj的地址值
2.8 __getitem__、__setitem__、__delitem__
- 用于索引操作,如字典。以上分别表示获取、设置、删除数据
- getitem 获取
- setitem 设置
- delitem 删除
class Foo(object): def __getitem__(self, key): print('__getitem__',key) def __setitem__(self, key, value): print('__setitem__',key,value) def __delitem__(self, key): print('__delitem__',key) obj = Foo() result = obj['k1'] # 自动触发执行 __getitem__ obj['k2'] = 'alex' # 自动触发执行 __setitem__ del obj['k1']
2.9 __metalass__ 和 __new__
- __metalass__ 其用来表示该类由 谁 来实例化创建
- __new__ 触发 __init__创建实例