类和对象
简单来说类就是模板,对象由模板生成。
类的命名采用大驼峰命名法,即首字母大写;
对象的命名用小驼峰命名法。
eg:person=Person(“Tom”,20) 其中person是对象名,Person是类名。
类的属性
class Person(Object): #默认继承object类 object类是所有类的基类
hairColor="black"
类的属性就是共有属性,假设所有人的头发都是黑的,头发颜色为黑色作为Person类的属性,则之后定义的每一个对象的hairColor都是black。
对象的属性
class Person(object);
hairColor='black'
def __init__(self,name,age):
self.name=name
self.age=age
其中的self.name和self.age为对象的属性
类的方法
class Person(object):
hairColor='black'
def __init__(self,name,age):
self.name=name
self.age=age
@classmethod
def hairColorChange(cls,color):
cls.hairColor= color
关键在于@classmethod,它下面的就是类的方法。
对象的方法
class Person(object):
hairColor='black'
def __init__(self,name,age):
self.name=name
self.age=age
@classmethod
def hairColorChange(cls,color):
cls.hairColor= color
def printInfo(self): # 对象的方法 自动传入self
print(self.name+":"+str(self.age))
输出结果如下:
注意:类名不可以访问对象的属性和方法,类名只有访问类的对象和方法。对象可以访问对象的属性和方法也可以访问类的属性和方法。因为类是公共的,相当于一个模板,所以对象可以访问类的属性和方法。
打包一个模块,快捷键:ctrl+alt+空格
访问控制
对象里的一些属性可能不想对外暴露,可以将其设置为私有属性,外界无法访问也无法改变。
class Person(object):
hairColor='black'
def __init__(self,name,age):
self.name=name
self.__age=age
@classmethod
def hairColorChange(cls,color):
cls.hairColor= color
def printInfo(self): # 对象的方法 自动传入self
print(self.name)
假设我们并不希望可以从外界访问到对象的年龄,于是我们在__init__中对象的属性age前加两个下划线,即变为私有属性。再访问age时报错,AttributeError: ‘Person’ object has no attribute ‘age’。
设置为私有属性之后,需要访问或改变对象的属性,只需要再添加set_age,get_age方法即可。
class Person(object):
hairColor='black'
def __init__(self,name,age):
self.name=name
self.__age=age
@classmethod
def hairColorChange(cls,color):
cls.hairColor= color
def printInfo(self): # 对象的方法 自动传入self
print(self.name)
def get_age(self):
return self.__age
def set_age(self,age):
self.__age=age
继承
新的class称为子类(subclass),被继承的class称为基类、父类或超类。
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写,具体可看下文中run的调用。super() 函数是用于调用父类(超类)的一个方法。
为了更加明显的体现出子类与父类之间的关系,我们向Person类中增加一个对象的方法run,具体如下:
class Person(object):
hairColor='black'
def __init__(self,name,age):
self.name=name
self.__age=age
@classmethod
def hairColorChange(cls,color):
cls.hairColor= color
def printInfo(self): # 对象的方法 自动传入self
print(self.name)
def get_age(self):
return self.__age
def set_age(self,age):
self.__age=age
def run(self):
print("Person Running")
定义Student子类,如下:
class Student(Person):
def __init__(self,name,age,major):
super(Student,self).__init__(name,age) # 初始化父类
self.major=major # 初始化自己的属性
def run(self):
print("Student Running")
子类Student中的run覆盖了Person中的run。
多态
新增一个Person的子类,不必对testOverLoad()做任何修改,实际上,任何依赖Person作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。
开闭原则:
“开”,对扩展开放,即可以向Person中增加子类
“闭”,对修改封闭,不需要修改依赖Person的testOverLoad函数
def testOverLoad(obj):
obj.run()
testOverLoad(person)
testOverLoad(student)
运行结果如下: