类和实例
类是创建实例的模板,实例则是一个一个具体的对象
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
Python允许对实例变量绑定任何数据
定义类
class Student(object):
pass
#object 该类从哪个类中继承
#Student类名
创建实例
>>> bart = Student()
创建属性
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
#注意__init__”前后分别有两个下划线
数据封装
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
>>> bart.print_score()
Bart Simpson: 59
访问权限
Python本身没有任何机制阻止你干坏事,一切全靠自觉。
实例变量可以是:
xx 普通变量
__xx__ 特殊变量
__xx 私有变量 (其实外部也可以访问,看解释器解释)
_xx 这么命名是希望被视为私有变量
想让内部属性不被外部调用,在属性名称前加两个下划线
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
def get_name(self):
return self.__name
def get_score(self):
return self.__score
def set_score(self, score):
self.__score = score
继承和多态
可以使子类获得父类的全部功能
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
pass
class Cat(Animal):
pass
dog = Dog()
dog.run()
cat = Cat()
cat.run()
Animal is running...
Animal is running...
可以对代码做改进,即多态
子类的方法会覆盖父类
class Dog(Animal):
def run(self):
print('Dog is running...')
class Cat(Animal):
def run(self):
print('Cat is running...')
再次运行可得结果
Dog is running...
Cat is running...
判断一个变量是否是某个类型可以用isinstance()判断:
b = Animal() # b是Animal类型
>>> isinstance(b, Animal)
True
多态例子进阶
定义一个函数,传入不同类
def run_twice(animal):
animal.run()
animal.run()
>>> run_twice(Animal())
Animal is running...
Animal is running...
>>> run_twice(Dog())
Dog is running...
Dog is running...
对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。
开闭”原则:
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。
动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
获取对象信息
判断对象类型方法
使用type()
返回对应的Class类型
使用isinstance()
>>> h = Husky()
>>> isinstance(h, Husky)
True
使用dir()
获得一个对象的所有属性和方法
返回一个包含字符串的list
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
实例属性和类属性
给实例绑定属性
class Student(object):
def __init__(self, name):
self.name = name
给类绑定属性
class Student(object):
name = 'Student'
属性归类所有,类的所有实例都可以访问到
在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。