类和对象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!
经验分享 程序员 微信小程序 职场和发展