1 python类的封装
简单的讲就是将众多属性和方法在类里面实现,外部通过接口访问。
属性的隐藏,先看一个例子:
class Person1:
def __init__(self, name, age):
self.name = name
self.age = age
def say(self):
print("I name is {} and {} years old.".format(self.name, self.age))
if __name__ == '__main__':
xiaoming = Person1("xiaoming", 12)
xiaoming.say()
在这个例子中Person1类有两个属性,我们可以直接通过xiaoming加.符号来访问其属性,例如:
xiaoming.age = 13
print(xiaoming.age)
实际上对于人的名字和年龄是不能随便改的,因此我们需要使用一个技术“隐藏”,使得外界只能看,不能改
代码如下:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@property
def age(self):
return self._age
def say(self):
print("I name is {} and {} years old.".format(self.name, self.age))
if __name__ == '__main__':
xiaoming = Person("xiaoming", 12)
xiaoming.say()
xiaoming.age = 13
print(xiaoming.age)
在这个例子中实际的变量是self._name, self._age, 外界看不出来,以为还是self.name, self.age
方法是通过装饰器@property将真正的变量遮挡起来,这种手段即隐藏
2 类的继承
通过在定义的新类后面加上待继承的类实现继承
示例:
from person2 import Person
class Student(Person):
def __init__(self, name, age):
super().__init__(name, age)
xiaozhang = Student("xiaozhang", 11)
xiaozhang.say()
这里有两点需注意:
1 Person为父类,Student为子类,子类拥有父类的一切特性(属性和方法)
2 super()函数可以调用一切父类的属性和方法(被隐藏的除外)
验证:print(super()._age) # 这儿会报错,说找不到对应的变量
3 类的多态
同一个方法,不同的行为
示例代码
from person2 import Person
class Student(Person):
def __init__(self, name, age):
super().__init__(name, age)
def say(self):
print("My name is {} and {} years old and I am in 6 grade.".format(self.name, self.age))
class Programmer(Person):
def __init__(self, name, age):
super().__init__(name, age)
def say(self):
print("I am a Programmer.My name is {} and {} years old.".format(self.name, self.age))
xiaozhang = Student("xiaozhang", 11)
xiaozhang.say()
Join = Programmer("Join", 35)
Join.say()