面向对象编程
1.# 类是抽象的模板
class Student(object): #object表示从哪个类继承的,没有继承类就使用object
"""docstring for Student"""
# 初始化必需属性,第一个参数永远是self
# 有了__init__方法,在创建实例的时候,就不能传入空的参数了
def __init__(self, name, score):
super(Student, self).__init__()
# 实例变量前加__ 就是private变量,只能内部访问, 约定加_ 也为私有变量, 但实际外部可以访问,一切靠自觉
# #不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,
# 所以,仍然可以通过_Student__name来访问__name变量,但是不同版本的Python解释器可能会把__name改成不同的变量名
self.__name = name
self.__score = score
self.__sp__ = '123' # 实例变量前后都加__ 为特殊变量,外部可以访问
# 第一个参数是self
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
def get_grade (self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
# 访问内部属性
def get_name(self):
return self.__name
# 修改内部属性
def set_name (self, name):
if not isinstance(name, str):
ErrorType('type error', name)
return
self.__name = name
bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()
print(bart.get_name())
bart.set_name('Jone')
print(bart.get_name())
2.# 继承
class Animal(object):
"""docstring for Animal"""
def __init__(self, ):
super(Animal, self).__init__()
# self.arg = arg
def run (self):
print('run run run ....')
class Cats(Animal):
"""docstring for Cats"""
def run(self):
print('Cat is running...')
class Dogs(Animal):
"""docstring for Dogs"""
def __init__(self):
super(Dogs, self).__init__()
self.__name__ = 'dog'
self.age = 10
def eat (self):
print(self.__name__ + ' eating meat...')
dog = Dogs()
dog.eat()
3.# 判断对象类型,有哪些方法 type()
# 判断对象类型,有哪些方法 type()
print(type(123)) # int
type(123)==int # True
type('abc')==str # True
type('abc')==type(123) # False
# 判断具体类型可以用 str int 但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量:
import types
print(type(abs) == types.BuiltinFunctionType)
# isinstance() 总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
# isinstance判断继承关系
print(isinstance(dog, Dogs))
print(isinstance(dog, Animal))
print(isinstance(dog, Dogs) and isinstance(dog, Animal))
# isinstance 判断类型
isinstance('a', str)
isinstance(123, int)
isinstance(b'a', bytes)
# isinstance 判断一个变量是否是某些类型中的一种
isinstance([1, 2, 3], (list, tuple))
isinstance((1, 2, 3), (list, tuple))
# dir() 获得一个对象的所有属性和方法,可以使用dir()函数 返回一个包含字符串的list
# print(dir('AB'))
# ['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
#
# 配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
# 只有在不知道对象信息的时候,我们才会去获取对象信息
print(hasattr(dog, '__name__')) # 判断对象属性是否存在
print(hasattr(dog, 'age'))
setattr(dog, 'y', 19) # 设置新属性
print(hasattr(dog, 'y')) # True
print(getattr(dog, 'y', 404)) # 19 如果不存在,会报错,可以添加第三个参数,返回默认值
print(hasattr(dog, 'run')) # 判断对象方法是否存在
# 正确用法 首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取
def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None
- #实例属性和类属性
# 在编写程序的时候,千万不要对实例属性和类属性使用相同的名字
# ,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性
class Student1(object):
name = 'Student' # 这种属性为类属性,类的所有实例都可以访问,相当于public
count = 0
def __init__(self, age):
self.name = age
Student.count += 1 # 每实例化一次,次数增加1次