类和实例
在python中,定义类是通过class关键字。
class Student(object):
pass
定义好了类,就可以通过类创建出类的实例,创建实例是通过类名+()实现的
bart = Student()
就是一个Student的实例
由于类可以起到模板的作用,因此可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
__init__方法的第一个参数永远是self,表示创建的实例的本身,因此在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
数据封装
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
lisa = Student('Lisa', 90)
bart = Student('Bart', 59)
print(lisa.name, lisa.get_grade())
print(bart.name, bart.get_grade())
访问限制
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在python中,实例的变量名如果以__开头,就变成了一个私有变量,只有内部可以访问,外部不能访问。
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))
如果外部需要获得内部的属性或修改内部的属性,可以使用setget方法。
class Student(object):
...
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
继承和多态
编写一个名为Animal的class,有一个run()方法可以直接打印:
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
def run(self):
print('Dog is running...')
def eat(self):
print('Dog is eating')
class Cat(Animal):
pass
def run_twice(animal):
animal.run()
animal.run()
dog = Dog()
print(dog.run())
cat = Cat()
print(cat.run())
print(run_twice(Animal()))
获取对象信息
判断对象类型可以使用type()函数。基本类型都可以用type()函数判断,如果一个变量指向函数或者类,也可用type()判断。type()函数返回对应的class类型。
print(type(123))
print(type('str'))
print(type(abs))
print(type(123)==type('str'))
要判断一个对象是否是函数,可以使用types模块中定义的常量
import types
def fn():
pass
print(type(fn) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x: x) == types.LambdaType)
print(type((x for x in range(10))) == types.GeneratorType)
对于class的继承关系来说,使用type()就很不方便,可以使用isinstance()函数。能用type()判断的基本类型也可以用isinstance()判断,并且还可以判断一个变量是否是某些类型中的一种。
h = Husky()
print(isinstance(h, Husky))
print(isinstance([1, 2, 3], (list, tuple)))
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list。
print(dir('abc'))
类似__xxx__的属性和方法在python中都是有特殊用途的,比如__len__方法返回长度。在python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的。
print(len('abc'))
print('abc'.__len__())
实例属性和类属性
给实例绑定属性的方法是通过实例变量,或者通过self变量
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.score = 90
给类本身绑定一个属性,可以直接在class中定义属性,这种属性是类属性,归类所有。
class Student(object):
name = 'Student'