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
#???抽象基类不能直接使用???