标签:初始 自己的 实例化 man 改名 基类 位置 需要 顺序
在成员前面添加两个下划线即可
class Person():
# name是公有的成员
name = "小明"
# __age是私有的成员
__age = 18
# 继承的语法
# 在python中,任何类都有一个共同的父类叫object
>>> 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
>>> class Person(object):
name = 'NoName'
age = 18
__score = 0 # 考试成绩是秘密,只要自己知道
_petname = "sec" #小名,是保护的,子类可以用,但不能公用
def sleep(self):
print("Sleeping ... ...")
>>> class Teacher(Person):
pass
# 创建一个Teacher类实例
>>> 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
# 继承中的构造函数 -1
>>> class Animal(): # 动物
pass
>>> class mammal(Animal): #哺乳动物
pass
>>> class Dog(mammal): # 狗是哺乳动物
# __init__就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def __init__(self):
print("I am init in dog")
# 实例化的时候 自动调用了Dog的构造函数
>>> kaka = Dog()
输出:
I am init in dog
# 继承中的构造函数 -2
>>> class Animal(): # 动物
pass
>>> class mammal(Animal): #哺乳动物
def __init__(self):
print("我是哺乳动物的父类")
>>> class Dog(mammal): # 狗是哺乳动物
# __init__就是构造函数
# 每次实例化的时候,第一个被自动的调用
# 主要工作是进行初始化
def __init__(self):
print("I am init in dog")
# 实例化的时候 自动调用了Dog的构造函数
>>> kaka = Dog()
# 猫没有用写构造函数
>>> class Cat(mammal):
pass
# 此时应该自动调用构造函数,因为Cat没有构造函数,所以查找父类的构造函数
# 在父类mammal中查找到了构造函数,则停止向上查找
>>> c = Cat()
输出:
I am init in dog
我是哺乳动物的父类
# 继承中的构造函数 -3
>>> 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")
# 实例化Dog时,查找到Dog的构造函数,参数匹配,不报错
>>> kaka = Dog()
>>> class Cat(mammal):
pass
# 实例化Cat类时,调用Cat类的构造函数,由于Cat没有构造函数,则向上查找,查找到父类mammal的构造,停止查找
# 因为mammal的构造函数需要两个参数,实例化的时候给了一个,报错
>>> #c = Cat()
输出:
I am init in dog
# 继承中的构造函数 -4
>>> class Animal(): # 动物
def __init__(self):
print("我是动物")
>>> class mammal(Animal): #哺乳动物
pass
>>> class Dog(mammal): # 狗是哺乳动物
pass
# 实例化Dog类时候,没有构造函数 一直向上查找,直到Animal类
>>> kaka = Dog()
输出:
我是动物
标签:初始 自己的 实例化 man 改名 基类 位置 需要 顺序
原文地址:https://www.cnblogs.com/yanht/p/11695127.html