最近了解python3类时,对self、类的属性、实例的属性有些迷惑,感觉python在这一块和C++还是有较大不同的。
通过下边一段程序,我把python里这一块直观理清了,记录一下。
大家可以结合本段代码更容易理解python类教程内容。如有错误 欢迎指正
#!/usr/bin/python3
# -*- coding: utf-8 -*-
class Test_Self():
val_0 = "val_0" #属于类的属性,要在前边定义
#self.val_0 = "val_0" 这句话编译会报错,提示self未定义
def __init__(self):
self.val_1 = "self.val_1" # 实例可以访问的属性,在__init__里定义,且需有self
val_2 = "val_2"
def func(self):
self.val_3 = "self.val_3"
#上句话等价于 val_3 = "self.val_3"
val_4 = "val_4"
print("Print in func")
def func2(): # 个人不建议定义这样的接口!!!
print("class static func2")
if __name__=="__main__":
print(Test_Self.val_0) #val_0是属于类的属性,所以无实例化时也可通过类直接调用
Test_Self.func2() #func2是属于类的接口,可以直接通过类调用,类似C++的static接口,但是个人不建议Python里这么使用
#func2() 编译会报错,func2是类内的函数,只能通过类或实例调用
#print(Test_Self.val_1) 编译会报错,提示Test_Self类没有属性val_1
#print(Test_Self.val_2) 错误同上
t = Test_Self() #实例化类的一个对象
print(t.val_0) #通过对象调用属于实例的属性值
print(t.val_1)
#print(t.val_2) 编译会报错,因为val_2是__init__函数的局部变量,不属于类的实例
#print(t.val_3) 编译报错,val_3不属于类的实例,因为没在__init__里初始化
#print(t.val_4) 编译报错,val_4不属于类的实例,且是func函数的局部变量
t.func() #通过对象调用接口
#t.func2() 编译报错,func2定义是无参的,但通过类实例调用会默认传入self