第五章笔记

1、关于函数属性

#假设已经创建了一个名为OpenObject的类(没设置属性self)
>>> o1 = OpenObject()
>>> o2 = OpenObject()
>>> o1.set_name('eon')
>>> o2.get_name()   
'eon'
#这并不是我们想要的结果

下面是设置属性self

>>> class Person:
        def set_name(self,name):
            self.name = name
        def get_name(self):
            print(self.name)
        def greet(self):
            print("Hello, world! I'm {}".format(self.name))
>>> a = Person()
>>> a.set_name('eon')
>>> b = Person()
>>> b.set_name('noob')
>>> b.greet()
Hello, world! I'm noob
>>> a.greet()
Hello, world! I'm eon

class语句创建独立的命名空间,用于在其中定于函数。(self类似于属性?)

2、判断一个类时候是另一个类的子类,可以使用issubclass(s,f)

>>> class Filter:
        def init(self):
            self.blocked = []
>>> class SFilter(Filter):
        def init(self):
            self.blocked = ['S']
>>> issubclass(Filter,SFilter)
False
>>> issubclass(SFilter,Filter)
True

若想知道已知类的基类,可以使用_bases_

>>> SFilter.__bases__
(<class 'Filter'>,)
>>> Filter.__bases__
(<class 'object'>,)

想要知道对象属于哪个类,可用属性_class_

>>> a = SFilter()
>>> a.__class__
<class 'SFilter'>
>>> b = Filter()
>>> b.__class__
<class 'Filter'>

3、上一条中提到的查找基类的属性_bases_中base是复数形式,基类可能是多个

>>> class Calculator:
        def calculate(self,expression):
            self.value = eval(expression)

>>> class Talker:
        def talk(self):
            print('Hi, my value is',self.value)

>>> class TalkingCalculator(Calculator,Talker):
        pass
>>> tc = TalkingCalculator()
>>> tc.calculate('1+2*3')
>>> tc.talk()
Hi, my value is 7

这种称为多重继承(尽量避免使用)
pass

4、接口和内省
pass

#函数hasattr()可以检测函数方法是否存在
>>> hasattr(tc,'talk)
True
>>> hasattr(tc,'fnork')
False

5、抽象基类(********************

>>> from abc import ABC,abstractmethod
>>> class Talker(ABC):
        @abstractmethod
        def talk(self):
            pass
            Talker()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: Can't instantiate abstract class Talker with abstract methods talk   #不能用抽象的方法来实例化抽象类的Talker
>>> class Knigget(Talker):
        pass
>>> Knigget()
Traceback (most recent call last):   #没重写talk,因此这个类也是抽象的,不能实例化
  File "<input>", line 1, in <module>
TypeError: Can't instantiate abstract class Knigget with abstract methods talk
>>> class Knigget(Talker):
        def talk(self):
            print('Hi')    #重新编写类,可以实例化
>>> k = Knigget
>>> k = Knigget()
>>> isinstance(k,Talker)
True
>>> k.talk()
Hi
#???抽象基类不能直接使用???
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值