类和对象4:类、类对象、实例对象
1. 基本概念
通过代码描述类的属性、方法等内容,实现类的定义;
类定义后即创建类对象,包括定义的类的各种属性和方法;
基于类创建各个实例对象,实例对象继承类的所有属性和方法;
2. 实例对象的属性/方法
实例对象,如尚未修改继承至类的属性或方法,实例对象调用的属性和方法即类对象的属性和方法;
实例对象,如对类的属性或方法做了赋值、重构,即使内容/代码完全一致,也重新创建了独属于该实例对象的属性或方法;
#类定义,创建类对象 class Test: testNo = 0 #创建三个类的实例对象 test1 = Test() test2 = Test() test3 = Test() #实例对象test1,赋值属性testNo test1.testNo = 10 #除实例对象test1外,类对象和其他实例对象,该属性值不变 print(Test.testNo, test1.testNo, test2.testNo, test3.testNo) 0 10 0 0 #类对象Test,赋值属性testNo Test.testNo = 5 #除除实例对象test1外,可见其他实例对象的属性testNo,即类对象的属性testNo,跟随改变 print(Test.testNo, test1.testNo, test2.testNo, test3.testNo) 5 10 5 5 #再对实例对象test2做上述操作,结果一致 test2.testNo = 15 Test.testNo = 20 print(Test.testNo, test1.testNo, test2.testNo, test3.testNo) 20 10 15 20
3. 命名冲突
如果属性名和方法名一致,则属性会覆盖方法;
为避免命名冲突,编写代码时需要注意尽量利用继承/组合来复用已有属性、方法,使用更规范、可读性较好的命名规则。
#创建类 class Test: testNo = 0 def testFun(self): print(hi!) #创建实例对象 test1 = Test() test2 = Test() #赋值与方法同名属性 test1.testFun = 1 #调用方法失败,属性已覆盖方法 test1.testFun() Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: int object is not callable test1.testFun 1 #其他实例对象仍能正常调用方法 test2.testFun() hi!
4. 类对象的删除
删除类对象后,实例对象仍可正常调用所有的方法和属性。
#创建类 class Test: testinfo = Hello, everyone! def __init__(self,name): self.name = name def showinfo(self): print(self.testinfo) #创建类的实例对象 test1 = Test(test1) #删除类 del Test #类对象的属性、函数无法使用,也无法在创建该类的实例对象 Test.testinfo Traceback (most recent call last): File "<input>", line 1, in <module> NameError: name Test is not defined Test.showinfo(Test(testx)) Traceback (most recent call last): File "<input>", line 1, in <module> NameError: name Test is not defined test2 = Test(test2) Traceback (most recent call last): File "<input>", line 1, in <module> NameError: name Test is not defined #已创建的实例的属性和方法,仍可以正常使用 test1.name test1 test1.testinfo Hello, everyone! test1.showinfo() Hello, everyone!
下一篇:
Typescript学习笔记(1.0)