封装
继承
多态
封装就是对对象的成员进行访问限制
封装的三个级别:
判断对象的位置
私有
私有成员是最高级别的封装,只能在当前类或对象中访问
在成员前面添加两个下划线即可
class Person():
# name是公有的成员
name = "小明"
# __age是私有的成员
__age = 18
Python的私有不是真私有,是一种称为name mangling的改名策略 可以使用对象,_classname__attributename(_类名__属性名)访问
受保护的封装 protected
公开的,公共的 public
继承就是一个类可以获得另外一个类中的成员属性和成员方法
作用:减少代码,增加代码的复用功能,同时可以设置类与类直接的关系
继承与被继承的概念:
被继承的类叫父类,也叫基类,也叫超类
用于继承的类,叫子类,也叫派生类
继承与被继承一定存在一个 is-a 关系
class Person():
name = 'NoName'
age = 0
def sleep(self):
print("Sleeping … …")
#父类写在括号内
class Teacher(Person):
def teach(self):
pass
t = Teacher()
print(t.name)
print(Teacher.name)
输出:
NoName
NoName
继承的特征
继承变量函数的查找顺序问题
构造函数
super
super不是一个关键字,而是一个类
super的作用是获取MRO(MethodResolustionOrder)列表中的第一个类
super于父类直接没有任何实质性关系,但通过super可以调用到父类
super使用两个方法,参见在构造函数中调用父类的构造函数
class Person(object):
name = 'NoName'
age = 18
__score = 0 # 考试成绩是秘密,只要自己知道
_petname = "sec" #小名,是保护的,子类可以用,但不能公用
def sleep(self):
print("Sleeping … …")
class Teacher(Person):
pass
t = Teacher()
子类实例访问父类public类型的变量 可以
print(t.name)
子类实例访问父类的protected类型的变量 可以
print(t._petname)
子类访问父类的private类型的变量 不可以
print(t.__score)
p = Person()
print(p._Person__score)
print('*' * 20)
print(id(Person.name))
print(id(t.name))
t.sleep()
输出:
NoName
sec
0
4496482928
4496482928
Sleeping … …
class Person(object):
name = 'NoName'
age = 18
__score = 0 # 考试成绩是秘密,只要自己知道
_petname = "sec" #小名,是保护的,子类可以用,但不能公用
def sleep(self):
print("Sleeping … …")
class Teacher(Person):
name = '我是老师的名字'
t = Teacher()
print(t.name)
输出:
我是老师的名字
class Person(object):
name = 'NoName'
age = 18
__score = 0 # 考试成绩是秘密,只要自己知道
_petname = "sec" #小名,是保护的,子类可以用,但不能公用
def sleep(self):
print("Sleeping … …")
def work(self):
print("make some money…")
class Teacher(Person):
name = '我是老师的名字'
def make_test(self):
print("attention")
def work(self):
# 扩充父类的功能只需要调用父类相应的函数
#Person.work(self)
# 扩充父类的另一种方法
# super代表得到父类
super().work()
self.make_test()
t = Teacher()
t.work()
输出:
make some money…
attention
class Dog():
# init就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def init(self):
print("I am init in dog")
kaka = Dog() # 实例化的时候自动调用了构造函数,括号内参数需要跟构造函数的参数匹配
输出:
I am init in dog
class Animal(): # 动物
pass
class mammal(Animal): #哺乳动物
pass
class Dog(mammal): # 狗是哺乳动物
# init就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def init(self):
print("I am init in dog")
kaka = Dog()
输出:
I am init in dog
class Animal(): # 动物
pass
class mammal(Animal): #哺乳动物
def init(self):
print("我是哺乳动物的父类")
class Dog(mammal): # 狗是哺乳动物
# init就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def init(self):
print("I am init in dog")
kaka = Dog()
class Cat(mammal):
pass
c = Cat()
输出:
I am init in dog
我是哺乳动物的父类
class Animal(): # 动物
pass
class mammal(Animal): #哺乳动物
def init(self, name):
print("我是哺乳动物的父类{0}".format(name))
class Dog(mammal): # 狗是哺乳动物
# init就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def init(self):
print("I am init in dog")
kaka = Dog()
class Cat(mammal):
pass
#c = Cat()
输出:
I am init in dog
class Animal(): # 动物
def init(self):
print("我是动物")
class mammal(Animal): #哺乳动物
pass
class Dog(mammal): # 狗是哺乳动物
pass
kaka = Dog()
输出:
我是动物
手机扫一扫
移动阅读更方便
你可能感兴趣的文章