学习文档 from https://www.liaoxuefeng.com
面向对象高级编程
多重继承、定制类、元类
使用__slots__
动态语言的特点
可以给实例绑定方法,但不影响其它实例
class Student():
pass
s = Student()
print(hasattr(s,'named')) #False
def named(self,name):
self.name = name
from types import MethodType
s.named = MethodType(named,s)
print(hasattr(s,'named')) #True
s.named('Jack')
print(s.name) #Jack
可以给类绑定方法
class Student():
pass
def f(self): #注意这个f并没有在Student里定义
print('this is f')
Student.f = f
s = Student()
s.f() #this is f
这样看python的类太不安全,能不能限制添加属性呢,这是可以用__slots__来达到目的。
class ClassA(object):
__slots__ = ('play','act')
a = ClassA()
a.play = 'playing'
a.act = 'running'
#a.hello = '--' #AttributeError: 'ClassA' object has no attribute 'hello'
class ClassB(ClassA):
__slots__ = ('test')
b = ClassB()
b.play = 'playing'
b.act = 'running'
b.test = 'testing'
#b.hello = '--!' #AttributeError: 'ClassB' object has no attribute 'hello'
class ClassC(ClassB):
pass
class ClassD(ClassC):
__slots__ = ('hello')
d = ClassD()
d.hello = '--!'
d.say = 'he say:' #对D没有限制了,即父类没有限制,则子类没有限制,推测object本身是带限制的
@property装饰器的使用
方法可以用访问属性的方式调用,即a.f,非a.f()
用 @property注解一个方法getter,可以为该方法创建另一个装饰器@f.setter
class ClassA(object):
def __init__(self):
self.v = 100
def test(self):
print('print1')
def test(self):
print('print2')
@property
def gv(self):
return self.v
@gv.setter
def gv(self,val): #没这个setter方法的话,gv就成了只读属性
self.v = val
a = ClassA()
a.test() #print2
print(a.gv) #100
a.gv = 99