通过廖雪峰的Python教程学习http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431865288798deef438d865e4c2985acff7e9fad15e3000
类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
class Student():
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
bart = Student("kanxue",150)
bart.print_score()
注意到init方法的第一个参数永远是self,表示创建的实例本身。
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self
访问限制
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
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))
使用set和get
def get_name(self):
return self.__name
def set_score(self, score):
self.__score = score
继承和多态
参考Java
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
def run(self):
print('Dog is running...')
class Cat(Animal):
def run(self):
print('Cat is running...')
def run_twice(animal):
animal.run()
a = Animal()
b = Dog()
c = Cat()
run_twice(a)
run_twice(b)
run_twice(c)
D:\ikanxue\program\Python3.5\python.exe D:/ikanxue/kanxue_studio/Python3.5/pythonTest/class_unit/classInheritance.py
Animal is running…
Dog is running…
Cat is running…
Process finished with exit code 0
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:
class Timer(object):
def run(self):
print('Start...')
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
动态添加属性和方法
from types import MethodType
class Student(object):
__slots__ = ('name', 'age','set_age')
def set_age(self,age):
self.age = age
b = Student()
a = Student()
a.name = "kanxue"
a.set_age = MethodType(set_age,a)
a.set_age(25)
print(a.age)
print(a.name)
# print(b.name)
# print(b.age)
Student.set_age = set_age
b.set_age(100)
print(b.age)
D:\ikanxue\program\Python3.5\python.exe D:/ikanxue/kanxue_studio/Python3.5/pythonTest/class_unit/highcla.py
25
kanxue
100
Process finished with exit code 0
给一个实例绑定的方法,对另一个实例是不起作用的。
给所有实例都绑定方法,可以通过给class绑定方法
__slots__用来限制实例的属性
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称