本章学习链接如下:
Python 面向对象——1.基本概念
实例的属性
1.创建对象
在上一小节的学习中我们提到了类中的变量与函数变量的区别,self.param1和param1
,接下来我们继续详细解释这个知识点。
当我们创建一个学生的类,比如如下代码所示,里面没有用构造函数创造实例属性,类只有当对象被创建时才会被使用,不然什么用都没有。只要对象被创建,类的这段代码就会被运行一遍。
class student():
pass
在这个类的基础上咱们创建一个对象lina,并打印看看lina的类型,我们可以看到lina属于class student .
class student():
pass
lina=student() #类的实例化(创建对象)
print(type(lina))
还可以用isinstance 这个命令查看对象是不是属于这个类
class student():
pass
lina=student() #类的实例化(创建对象)
print(type(lina))
print(isinstance(lina,student))
2.创建实例的属性
我们还是先创建一个空类,再创建一个对象,基于这个对象我们再创建一些属性。
基于对象我们创造了lina的name,age,height等属性,其实这些属性是student这个类中的实例都具有的特点,我们可以用构造函数创建一些实例属性,写进类里面,这样就不用每个对象都需要去自己创建这些共同属性了。
class student():
pass
lina=student() #类的实例化(创建对象)
lina.name='lina'
lina.age=12
lina.height=172
print(lina.name,lina.age,lina.height)
3.区分self.name和name
其实在之前的学习中我们已经学习到了实例的很多共同属性是用构造函数写进类里来实现的,每当基于这个类创建一个对象,这些对象就有了所初始化的这些属性,就如我们之前所说, 我们现在来区分一下self.name 和name,name 是传入构造函数__init__(self,name,age,height):的参数,而self.name 是类中的参数,让我们把这些名称明显地区分一下:
下面的代码中,我们使用self.a,self .b,self.c分别作为接收构造函数中传入的参数(name,age,height)的变量,让我们运行如下代码,
class student():
def __init__(self,name,age,height):
self.a=name
self.b=age
self.c=height
lina = student('lina',12,172)
print(lina.a)
print(lina.name)
根据结果我们可以看到,第一个变量lina.a被正确打印,但是lina.name 这个变量不存在,这个结果表明所有的对象运用的变量其实是self.XXX,是类中的变量,而不是构造函数中传入的参数名。
说到这里,大家明白这两者之间的区别了吗?
区分好了之后,我们其实经常 将变量写成self.name=name,因为这样表示的含义是传入的name赋值给实例的name这个属性,如果写成self.a,那对于实例的属性不够直观。
class student():
def __init__(self,name,age,height):
self.name=name
self.age=age
self.height=height
lina = student('lina',12,172)
print(lina.name,lina.age,lina.height)
4.查看实例的属性
用实例._ _dict_ _可以将实例的属性用字典的方式打印出来
class student():
def __init__(self,name,age,height):
self.name=name
self.age=age
self.height=height
lina = student('lina',12,172)
print(lina.name,lina.age,lina.height)
print(lina.__dict__)
类的属性
我们刚刚已经介绍完实例的属性,当我们想调用某个属性的时候直接执行命令:某某对象.属性就行了,比如
lina.name
lina.age
lina.height
1.创建类的属性
如果我们想实现每创建一个对象就对他计数一次,比如在学生系统里面打印出“欢迎注册育才中学学生系统,您是第XX位学生”,看如下代码,我们可以在类中创建变量,级别与构造函数一样,因为每创建一个对象,构造函数就会被调用一次,所以在构造函数里面调用类的属性可以实现number累加的效果。
class student():
number = 0 # 创建类的属性
def __init__(self, name, age, height):
student.number += 1 # 在创建实例时增加计数器
self.name = name
self.age = age
self.height = height
print(f"欢迎注册育才中学学生系统,您是第{student.number}位学生!")
lina = student('lina', 12, 172)
# 不需要单独增加计数器,因为已经在构造函数中处理了
tom = student('tom', 13, 165)
# 同样不需要,计数器在创建实例时自动增加
也可以创建一次对象,就调用一次,可以实现同样的效果,只是代码没有那么简洁。
class student():
number=0#创建类的属性
def __init__(self,name,age,height):
self.name=name
self.age=age
self.height=height
lina = student('lina',12,172)
student.number += 1 # 调用类的属性
print(f"欢迎注册育才中学学生系统,您是第{student.number}位学生!")
tom=student('tom',13,165)
student.number += 1 # 调用类的属性
print(f"欢迎注册育才中学学生系统,您是第{student.number}位学生!")
为什么第二次调用时number没有重置为0呢,原因如下:
类属性属于类本身,而不是类的任何特定实例。student.number是一个类属性,0是他的初始化后的值,因为不涉及循环的代码执行,只是简单的调用函数,类的属性的参数更新可以跟着变量保持下来。