【面向对象3】------- PYTHON基础8

154 阅读4分钟

6. 类变量的创建使用及修改

类中变量的类型

  • 类体中,所有函数之外:此范围定义的变量,称为类属性或类变量;
  • 类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
  • 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。

6.1 类变量(类属性)

class Person:  # 定义一个Person类
    '''
    这是一个Person类的定义
    '''

    def __init__(self):  # __init__函数
        print("自动调用了构造方法")

    name = '某某'  # 类变量的定义


Someone_1 = Person()

print(Person.name)  # 以 “类名.变量” 的方式打印
print(Someone_1.name)  # 以 “类对象.变量” 的方式打印

'''
# 类变量在所有实例化对象中是作为公用资源存在的。

# 如果修改了公用资源,则所有对象的变量都一起改变。
Person.name = '小明'
print(Person.name)  #结果输出‘小明’
print(Someone_1.name) #结果输出‘小明’
'''

# 而如果只修改了对象的属性,则不会对类变量造成任何影响。
Someone_1.name = '小明'
print(Person.name)  #结果输出‘某某’
print(Someone_1.name) #结果输出‘小明’

6.2 实例变量(实例属性):“self.变量名”

注意,实例变量只能通过对象名访问,无法通过类名访问。

class Person:  # 定义一个Person类
    '''
    这是一个Person类的定义
    '''
    def __init__(self, name):  # __init__函数
        self.name = name  # 实例属性,表示定义的实例有自己的name

    def mysay(self):
        self.say = "I am instance"  # 实例属性也可以定义在实例方法中

Someone_1 = Person(name="小明")
print(Someone_1.name)  # 以类对象.变量的方式打印

Someone_1.mysay()  # 为了感知实例方法内的实例属性,需要显式的调用实例方法
print(Someone_1.say)  # 以类对象.变量的方式打印。
# 思考:如果没有调用mysay()函数,此行会不会报错

# print(Person.name) # 通过类名访问实例变量,会报错

输出

小明
I am instance

6.3 局部变量 直接以“变量名=值”的方式进行定义

class Person:  # 定义一个Person类
    '''
    这是一个Person类的定义
    '''
    def __init__(self, name):  # __init__函数
        self.name = name  # 实例属性,表示定义的实例有自己的name

    def mysay(self):
        self.say = "I am instance"  # 实例属性也可以定义在实例方法中

    def change_name(self):
        name = self.name + ' Junior'  
# 此行中,等号左边的变量name属于局部变量,右边的属于实例变量
        print("局部变量name为:", name)

Someone_1 = Person(name="大雄")
print('实例变量Someone_1.name为:', Someone_1.name)  # 实例变量

Someone_1.change_name()
print('调用change_name方法之后:')
print('实例变量Someone_1.name为:', Someone_1.name)  # 实例变量未发生任何修改

输出

实例变量Someone_1.name为: 大雄
局部变量name为: 大雄 Junior
调用change_name方法之后:
实例变量Someone_1.name为: 大雄

7. 类的继承

实现继承的类称为==子类==,被继承的类称为==父类(也可称为基类、超类)== 子类继承父类时,只需在定义子类的时候,将父类(可以是多个)放在子类之后的圆括号里即可。语法格式如下:

class 类名(父类1, 父类2, ...):
#类定义部分

注意: 1如果该类没有显式指定继承自哪个类,则默认继承 object 类(object 类是 Python 中所有类的父类,即要么是直接父类,要么是间接父类) 所以以下两行定义类的方式是一样的:

class 类名():
    #类定义部分
class 类名(object):
    #类定义部分

eg:

class People(object):
    def say(self):
        print("我是一个人,名字是:", self.name)

class Animal(object):
    def display(self):
        print("人也是高级动物")

class Person(People, Animal):  # 同时继承 People 和 Animal 类, 其同时拥有 name 属性、say() 和 display() 方法
    pass

Someone_1 = Person()
Someone_1.name = "张三"  # 给实例对象赋值
Someone_1.say()
Someone_1.display()

输出

我是一个人,名字是: 张三
人也是高级动物

从结果看出,虽然 Person 类为空类,但由于其继承自 People 和 Animal 这 2 个类,因此实际上 Person 并不空。它同时拥有这 2 个类所有的属性和方法。 ==eg:多继承顺序== 多个父类中包含同名,根据子类继承多个父类时这些父类的前后次序决定.

class People(object):
    def __init__(self):
        self.name = 'People'
    def say(self):
        print("People类", self.name)

class Animal(object):
    def __init__(self):
        self.name = 'Animal'
    def say(self):
        print("Animal类", self.name)

class Person(People, Animal):  
# People中的 name 属性和 say() 会覆盖 Animal 类中的同名属性和方法
    pass

Someone_1 = Person()
Someone_1.name = "张三"
Someone_1.say()

输出

People类 张三