您的位置:首页 > 编程语言 > Python开发

20161028 Python 读书笔记之类、多态、继承、封装

2016-10-28 13:20 627 查看
超级抽象

多态:意味着可以对不同类的对象使用同样的操作,他们会像被”施了魔法一般“工作

封装:对外部世界隐藏对象的工作细节

继承:以普通的类为基础建立专门的类对象

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模块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: