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类 张三