20161028 Python 读书笔记之类、多态、继承、封装
2016-10-28 13:20
627 查看
超级抽象
多态:意味着可以对不同类的对象使用同样的操作,他们会像被”施了魔法一般“工作
封装:对外部世界隐藏对象的工作细节
继承:以普通的类为基础建立专门的类对象
1.1多态
1.2封装
1.3类的书写
1.4特性、函数和方法
class MemberCounter:
members = 0
def init(self):
MemberCounter.members += 1
m1 = MemberCounter()
m1.init()
print MemberCounter.members
m2 = MemberCounter()
m2.init()
print MemberCounter.members
1.6超类
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): #SPAMFilter是Filter的子类
def init(self): #重写Filter超类中的init方法
self.blocked = ['SPAM']
f = Filter()
f.init()
print f.filter([1,2,3])
#Filter类的用处在于他可以用作其他类的基类(超类)
s = SPAMFilter()
s.init()
print s.filter(['SPAM','SPAM','SPAM','SPAM','eggs','bacon','SPAM'])
#调用继承
#如果想看一个类是否是另外一个的子类,可以使用issbclass函数:
print issubclass(SPAMFilter,Filter)
print issubclass(Filter,SPAMFilter)
#如果想知道已知类的基类,可以直接使用它的特殊特性__bases__:
print SPAMFilter.__bases__
#同样还能使用isinstance方法检查一个对象是否是一个类的实例
print isinstance(s,SPAMFilter)
print isinstance(s,Filter)
print isinstance(s,str)
#如果想知道一个对象属于哪个类,可以使用__class__特性:
print s.__class__
#如果使用__metaclass__=type或从object继承的方式来定义新式类,那么可以使用type(s)查看实例的类
#多个超类
class Calculator:
def Calculate(self,expression):
self.value = eval(expression) #eval函数将字符串当成有效的Python表达式求值,并返回计算结果
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()
#接口和内省
print hasattr(tc,'talk') #检查所需的方法是否存在
print hasattr(tc,'fnord')
print callable(getattr(tc,'talk',None)) #检查talk特性是否可调用
print callable(getattr(tc,'fnord',None))
#这段代码使用了getattr函数,而没有在if语句内使用hasattr函数直接访问特性,getsttr函数允许提供默认值,一边在特性不存在时使用
#然后对返回的对象使用callable函数。
#与getattr相对应的函数是setattr,可以用来设置对象的特性;
setattr(tc,'name','Mr,Gumby')
print tc.name
#如果要查看对象内所存储的值,那么可以使用__dict__特性。如果真的想要找到对象是由什么组成的,可以使用inspect模块。
多态:意味着可以对不同类的对象使用同样的操作,他们会像被”施了魔法一般“工作
封装:对外部世界隐藏对象的工作细节
继承:以普通的类为基础建立专门的类对象
1.1多态
from random import choice #标准库里的rendom中包含的choice函数,可以从序列中随机选出元素,给变量赋值。 x = choice(['Hello!',[1,2,'e','e',4]]) print x.count('e') def length_message(x): print "The length of" , repr(x) , "is", len(x) #repr函数是多态性的代表之一,注意它的使用 length_message('Fnord') length_message([1,2,3])
1.2封装
# 封装:是对全局作用域中其他区域隐藏多余信息的原则。 # 封装可以不用关心对象是如何创建的而直接进行使用 # 假设有一个叫做OpenBbject的类 o = OpenObject() #this is how we create objects o.setName('Sir Lancelot') o.getName()
1.3类的书写
__metaclass__ = type #确定使用新式类 class Person: def setName(self,name): self.name = name #self是对于自身的引用 def getName(self): return self.name def greet(self): print "Hello,world! I'm %s." % self.name foo = Person() bar = Person() foo.setName('Luke Skywalker') bar.setName('Anakin Skywalker') foo.greet() bar.greet() #在调用foo的setName和greet函数时,foo自动将自己作为第一个参数传入函数中--因此形象命名为self。 #对于这个变量,每个人可能都会有自己的叫法。 print foo.name bar.name = 'Yoda' bar.greet()
1.4特性、函数和方法
class Class: def method(self): print 'I have a self!' def function(): print "I don't..." instance = Class() instance.method() instance.method = function instance.method() class Bird: song = 'Squaawk!' def sing(self): print self.song bird = Bird() bird.sing() birdsong = bird.sing birdsong() #为了让方法或者特性变为私有(外界无法访问) class Secretive: def __inaccessible(self): print "Bet you can't see me..." def accessible(self): print "The secret message is:" self.__inaccessible() s = Secretive() #s.__inaccessible() s.accessible() s._Secretive__inaccessible() #在外部也可以使用这个方法引用隐藏函数1.5类的命名空间
class MemberCounter:
members = 0
def init(self):
MemberCounter.members += 1
m1 = MemberCounter()
m1.init()
print MemberCounter.members
m2 = MemberCounter()
m2.init()
print MemberCounter.members
1.6超类
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): #SPAMFilter是Filter的子类
def init(self): #重写Filter超类中的init方法
self.blocked = ['SPAM']
f = Filter()
f.init()
print f.filter([1,2,3])
#Filter类的用处在于他可以用作其他类的基类(超类)
s = SPAMFilter()
s.init()
print s.filter(['SPAM','SPAM','SPAM','SPAM','eggs','bacon','SPAM'])
#调用继承
#如果想看一个类是否是另外一个的子类,可以使用issbclass函数:
print issubclass(SPAMFilter,Filter)
print issubclass(Filter,SPAMFilter)
#如果想知道已知类的基类,可以直接使用它的特殊特性__bases__:
print SPAMFilter.__bases__
#同样还能使用isinstance方法检查一个对象是否是一个类的实例
print isinstance(s,SPAMFilter)
print isinstance(s,Filter)
print isinstance(s,str)
#如果想知道一个对象属于哪个类,可以使用__class__特性:
print s.__class__
#如果使用__metaclass__=type或从object继承的方式来定义新式类,那么可以使用type(s)查看实例的类
#多个超类
class Calculator:
def Calculate(self,expression):
self.value = eval(expression) #eval函数将字符串当成有效的Python表达式求值,并返回计算结果
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()
#接口和内省
print hasattr(tc,'talk') #检查所需的方法是否存在
print hasattr(tc,'fnord')
print callable(getattr(tc,'talk',None)) #检查talk特性是否可调用
print callable(getattr(tc,'fnord',None))
#这段代码使用了getattr函数,而没有在if语句内使用hasattr函数直接访问特性,getsttr函数允许提供默认值,一边在特性不存在时使用
#然后对返回的对象使用callable函数。
#与getattr相对应的函数是setattr,可以用来设置对象的特性;
setattr(tc,'name','Mr,Gumby')
print tc.name
#如果要查看对象内所存储的值,那么可以使用__dict__特性。如果真的想要找到对象是由什么组成的,可以使用inspect模块。
相关文章推荐
- Python面向对象之类的封装、继承与多态
- 黑马程序员--OC之类的封装继承多态使用技巧
- Python之类的继承和多态
- python 面向对象三大特性(封装 多态 继承)
- python中封装、继承与多态
- python 对象的魔力--多态、封装和继承
- Python初学之类的继承和多态
- Python基础(6)- 类和对象(使用、继承、派生、组合、接口、多态、封装、property、staticmethod、classmethod、反射、slots、上下文管理协议、元类)
- 对于Python面向对象部分的理解(封装继承多态等等)
- Java之类的封装,继承,多态
- python——类——封装 继承 多态
- python学习小结5:封装、继承、多态
- 【python学习笔记】Python面向对象的理解(封装,继承,多态)
- python学习小结5:封装、继承、多态
- Python中关于封装,继承,多态的表述
- Python 学习笔记 - 面向对象(封装,继承和多态)
- Py修行路 python基础 (十六)面向对象编程的 继承 多态与多态性 封装
- Python之面向对象编程:封装、继承、多态
- python学习笔记14(多态、封装、继承)
- Python 学习笔记 - 面向对象(封装,继承和多态)