python浅学笔记7-面向对象高级编程

本文介绍了Python面向对象编程的高级技巧,包括使用__slots__限制添加属性,@property装饰器,多重继承MixIn,定制类,枚举类的使用,以及元类的概念和在ORM中的应用。通过学习,你可以掌握如何动态创建和修改类,以及如何实现对象-关系映射。
摘要由CSDN通过智能技术生成

面向对象高级编程

多重继承、定制类、元类

使用__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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值