最近开始学习TensorFlow了,所以Python的笔记好久没有更新。另外也是为了提高笔记的内容价值,所以更新的会速度减慢。
1.创建类属性及实例属性
添加类属性:
class Student(object):
name = 'Student' # 创建一个类属性name
student = Student()
student.name # 先访问实例属性name,由于实例属性name不存在,于是再自动访问类属性name
### 输出 ###
'Stddent'
如果要添加一个实例属性,可以使用下面的两种方式:
# 方式1
student.name = 'Li'
# 方式2
class Student(object):
def __init__(self,name): # 利用构造函数
self.name = name
student = Student('Li')
当实例属性名和类属性名相同时,实例属性会覆盖类属性:
class Student(object):
name = 'Student'
student = Student()
student.name = 'Li'
student.name # 实例属性覆盖了类属性
Student.name # 访问类属性 注意大小写(后面也是)
del student.name # 删除实例属性后,会自动访问同名的类属性
student.name
### 输出 ###
'Li'
'Student'
'Student'
1.1.比较实例属性和类属性
- 访问优先级:实例属性和类属性同名时会出现覆盖情况(实例属性覆盖类属性),所以建议不要使用相同的实例属性和类属性
- 归属:实例属性彼此独立,类属性为实例所共享
2.探究self参数
从上面的例子中我们知道了如何添加类属性和实例属性以及它们的区别。下面我们分析一下构造函数__init__
的self
参数。
你可能会疑惑,为什么在定义一个类的方法时它的第一个参数总是self
,这是因为,这里的self
参数指向类的实例本身,它将把相关参数绑定到实例上。下面举一个栗子证明self代表的是实例本身:
class Number(object):
def return_self(self):
return self # 返回实例!
def print_number(self):
print(123)
num = Number() # 实例化
n = num.return_self() # return_self调用实例对象并将其返回给变量n
num.print_number()
n.print_number()
### 输出 ###
123
123
# 上面的代码中,num和n都指向Number的实例,可见,self参数就是代表类的实例本身!
# 另外,还可以通过id()函数验证 id()函数用于获取对象的内存地址 如果地址相同 那么证明两个对象是相同的
id(num)
id(n)
### 输出 ###
1746475108728
1746475108728
而在调用方法的时候只需传入除self
之外的相关变量,这是因为Python能够自动把实例变量self传入。另外,由于指向实例的参数self
不是关键字,所以把原来self
位置用其他名称代替也没有关系,但建议使用约定俗成的self
。
有关的self的理解网上还有更详细深刻的解释,我的建议是随着学习不断深入再逐渐加深对概念的认识。知识是不断迭代的,而我笔记也会不断的更新。