7.1 对象魔法
7.1.1 多态-None
7.1.2 多态和方法-None
7.1.3 封装(待本章结束后补充)
7.1.4 继承-None
7.2 类
7.2.1 类的相关概念
在python中,首字母大写的名称指的是类;
超类(基类):鸟类是云雀的超类; 子类:云雀是鸟类的子类; 实例:阳台上的那只云雀(特指);
7.2.2 创建自定义类
在类中定义的函数称为 method(方法);
docstring 可放置于 def 语句后,以及模块、类的开头;
形参中的 self 应置于其他形参之前,必不可少,名称可另取,习惯上取做 self ;
>>> class Person:
... def set_name(self, name):
... self.name = name
... def get_name(self):
... return self.name
... def greet(self):
... print("Hello, world! I'm {}." .format(self.name))
>>> foo = Person()
>>> foo.set_name('Luke Skywalker' )
>>> foo.get_name()
>>> foo.name
>>> tem = foo.get_name
>>> tem()
7.2.3 attribute、function and 方法-None
7.2.4 隐藏
命名 method or attribute 时,若以两个下划线开头,则将其私有,即不能从外部访问;
私有的幕后处理:在类定义中,对所有以2个下划线开头的名称进行转换,在开头加上一个下划线和类名;
from module import * 语句不会导入以1个下划线开头 的名称;
>>> class Secretive :
... def __inaccessible (self) :
... print("Bet you can't see me ..." )
>>> s = Secretive()
>>> s._Secretive__inaccessible()
7.2.5 类的命名空间
class 语句创建独立的命名空间,类的所有成员均可访问该命名空间;
>>> class MemberCounter:
... members = 0
... def init(self):
... MemberCounter.members += 1
>>> m1 = MemberCounter()
>>> m1.init()
>>> MemberCounter.members
1
>>> m2 = MemberCounter()
>>> m2.init()
>>> MemberCounter.members
2
>>> m1.members = 'Two'
>>> m1.members
'Two'
>>> m2.members
2
7.2.6 指定超类
7.2.7 继承
>>> class Filter :
... def init (self) :
... self.blocked = []
... def filter (self, sequence) :
... return [x for x in sequence if x not in self.blocked]
>>> class SPAMFilter (Filter) :
... def init (self) :
... self.blocked = ['SPAM' ]
>>> f = Filter()
>>> f.init()
>>> f.filter([1 , 2 , 3 ])
[1 , 2 , 3 ]
>>> issubclass(SPAMFilter, Filter)
>>> True
>>> SPAMFilter.__bases__
(__main__.Filter,)
>>> Filter.__bases__
(object,)
>>> s = SPAMFilter()
>>> isinstance(s, SPAMFilter)
True
>>> isinstance(s, str)
False
>>> s.__class__
__main__.SPAMFilter
7.2.8 多个超类
>>> class Calculator:
... pass
class Talker:
... pass
class TalkingCalculator(Calculator, Talker):
... pass
7.2.9 接口和内省
>>> hasattr(tc, 'talk' )
>>> callable(getattr(s, 'talk' , None ))
7.2.10 抽象基类
继承抽象基类的子类必须重写抽象方法 ,否则不能实例化;
>>> from abc import ABC, abstractmethod
>>> class Talker(ABC):
... @abstractmethod
... def talk(self):
... pass
>>> class Knigget(Talker):
... def talk(self):
... print("Ni!" )
7.3 小结
类:表示一组 or 一类对象;
对象:包括 attribute 和 method ; attribute:属于对象的变量; method:类中定义的函数;
多态:无需知道对象属于哪个类即可调用其方法;
语句
功能
random.choice(sequence)
随机从非空序列中取一个元素
setattr(object, name, value)
将对象的指定属性设定为指定值