《Python基础教程》学习笔记之[D8]更加抽象——类

时间:2022-08-30 23:52:50
只做涂鸦笔记之用,如有疑议等问题可留言探讨。

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

# 面向对象 对象 object
# 多态 封装 继承
# 多态和方法

>>> 'abc'.count('a')
1
>>> ['a', 'b', 'c'].count('a')
1
>>>
# python是面形对象的

1+1
'str1' + 'str2'

from random import choice
x = choice(['x', 'y', ['x', '2', '3'], '4'])
x.count('x') # 注意 int 类型没有count方法

def length_message(x):
print "The length of", repr(x), "is", len(x)

# 可以看到上面的函数中使用了 repr,repr函数是典型的多态性的代表之一,可以对任何东西使用。
# 唯一能毁掉多态的就是函数的显示先查类型。比如 type,isinstance issubclass等函数,如果可能尽量避免。

# 封装 对外部隐藏不必要的细节,内容还是非常多的,只是简单介绍下,具体请实践

class NewObject():
def say(self, hello = 'hello'):
print hello

>>> n1 = NewObject()
>>> n1.say('first Object')
first Object
>>>
>>> n2 = NewObject()
>>> n.say()
hello
>>>

# 继承 简单说就是 爹有多少财产,允许给儿子多少,死了后,儿子就能继承多少

class Base():
def __init__(self, val):
self.val = val

class ExtendsClass(Base):

def printVal(self):
print self.val

>>> x = ExtendsClass('hello')
>>> x.printVal()
hello
>>>

# private 通过两个前置的下划线 __

# 类的命名空间,也就是类,以及类方法、成员等的访问范围

# 指定超类(父类)

class ClassName(ParentClassName):
def functionName(self):
pass

# 如果查看某类是否是另一个类的子类
issubclass()
# 也可以调用 __bases__

ClassName.__bases__

# 同样也可以采用 isinstance 检测 一个对象是否是一个类的实例
isinstance(instanceObject, ClassName)

# 使用 instance 并不是一个好习惯,使用多态会好一点


# 多个超类

class Class1:
def function1(self):
print 'function 1'

class Class2:
def function2(self):
print 'function 2'

class Class3(Class1, Class2):
pass

>>> Class3().function1()
function 1
>>> Class3().function2()
function 2
>>>

# 多重继承,注意顺序的优先级,否则可能带来不必要的麻烦。应该尽量避免使用多重继承

# 接口和内省 概念与多态有关,在处理对象时,只要关心他的接口即可。即:公开的方法和特性
# 小结

# 对象,类,多态,封装,继承,接口和内省,面向对象设计
# 涉及的一些新函数
callable(object)
getattr(object, name[, default])
hasattr(object, name)
isinstance(object, class)
issubclass(A, B)
random.choice(sequence)
setattr(object, name, value)
type(object)