目录
1. 基本概念
2. 实例对象的属性/方法
3. 命名冲突
4. 类对象的删除
通过代码描述类的属性、方法等内容,实现类的定义;
类定义后即创建类对象,包括定义的类的各种属性和方法;
基于类创建各个实例对象,实例对象继承类的所有属性和方法;
实例对象,如尚未修改继承至类的属性或方法,实例对象调用的属性和方法即类对象的属性和方法;
实例对象,如对类的属性或方法做了赋值、重构,即使内容/代码完全一致,也重新创建了独属于该实例对象的属性或方法;
#类定义,创建类对象
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
如果属性名和方法名一致,则属性会覆盖方法;
为避免命名冲突,编写代码时需要注意尽量利用继承/组合来复用已有属性、方法,使用更规范、可读性较好的命名规则。
#创建类
class Test:
testNo = 0
def testFun(self):
print('hi!')
#创建实例对象
test1 = Test()
test2 = Test()
#赋值与方法同名属性
test1.testFun = 1
#调用方法失败,属性已覆盖方法
test1.testFun()
Traceback (most recent call last):
File "", line 1, in
TypeError: 'int' object is not callable
test1.testFun
1
#其他实例对象仍能正常调用方法
test2.testFun()
hi!
删除类对象后,实例对象仍可正常调用所有的方法和属性。
#创建类
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 "", line 1, in
NameError: name 'Test' is not defined
Test.showinfo(Test('testx'))
Traceback (most recent call last):
File "", line 1, in
NameError: name 'Test' is not defined
test2 = Test('test2')
Traceback (most recent call last):
File "", line 1, in
NameError: name 'Test' is not defined
#已创建的实例的属性和方法,仍可以正常使用
test1.name
'test1'
test1.testinfo
'Hello, everyone!'
test1.showinfo()
Hello, everyone!