?本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。
目录
?
创建Person类,设置一个name属性;
这时不进行实例化就可以直接通过类名获取属性,
这就是类属性。
示例如下:
class Person(object):
# 这里的属性为类属性 通过类名来调用
name = 'Person'
print(Person.name)
# 执行结果
# Person
?
在类实例化为对象时,赋值或添加的属性为对象属性(不会改变原有类属性值)。
示例如下:
class Person(object):
# 这里的属性为类属性 通过类名来调用
name = 'Person'
def __init__(self, name):
# 对象属性赋值
self.name = name
print(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)
# 类属性没有发生改变
print(Person.name)
执行结果:
Person
small cat
Person
通过执行结果可以看出,实例化后赋值的name属性与类属性name并不相同,
最终也并没有通过赋值改变原有类属性的值。
对象属性优先级高于类属性。
场景:当Person对象未设置name属性时调用原有类属性值;
如果设置了对象属性,则调用对象属性值。
示例如下:
class Person(object):
# 这里的属性为类属性 通过类名来调用
name = 'Person'
def __init__(self, name):
# 对象属性赋值
# self.name = name
pass
print(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)
p1.name = '张三'
print(p1.name)
执行结果:
Person
Person
张三
删除对象中的name属性,在调用会用到同名的类属性。
示例如下:
class Person(object):
# 这里的属性为类属性 通过类名来调用
name = 'Person'
def __init__(self, name):
# 对象属性赋值
self.name = name
print(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)
del p1.name
print(p1.name)
执行结果:
Person
small cat
Person
动态给对象添加对象属性,只针对当前对象生效,对于类创建的其他对象没有作用。
示例如下:
class Person(object):
# 这里的属性为类属性 通过类名来调用
name = 'Person'
def __init__(self, name):
# 对象属性赋值
self.name = name
print(Person.name)
p1 = Person('small cat')
p1.age = 18
print(p1.age)
p2 = Person('zhang san')
print(p2.age)
执行结果:
Traceback (most recent call last):
File "E:\lianxipy\python基础\对象属性和类属性\Person.py", line 15, in <module>
print(p2.age)
AttributeError: 'Person' object has no attribute 'age'
Person
183
注意:以后千万别说对象属性与类属性重名,因为对象属性会屏蔽掉类属性。但是当删除对象属性后,在使用又能使用类属性了。
实例化对象后可进行动态添加属性和方法。
创建一个空类,动态添加属性。
示例如下:
class Person(object):
pass
p1 = Person()
p1.name = '张三'
print(p1.name)
执行结果:
张三
动态添加属性,体现了动态语言的特点(灵活)
from types import MethodType
在动态添加方法时,需要对方法的参数进行处理,否则会抛出self异常。
示例如下:
class Person(object):
pass
p1 = Person()
p1.name = '张三'
print(p1.name)
def say(self):
print('我的名字叫:%s' % self.name)
p1.speak = MethodType(say, p1)
p1.speak()
执行结果:
张三
我的名字叫:张三
?
比如只允许给对象添加name,age,height,weight属性
解决:定义类的时候,定义一个特殊属性(__slots__),可以限制动态添加的属性。
__slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。
示例如下:
class Person(object):
__slots__ = ('name', 'age', 'height', 'weight')
p1 = Person()
p1.name = '张三'
print(p1.name)
p1.age = 18
print(p1.age)
p1.gender = '男'
print(p1.gender)
执行结果:
张三
18
Traceback (most recent call last):
File "E:\lianxipy\python基础\动态添加属性\Person.py", line 12, in <module>
p1.gender = '男'
AttributeError: 'Person' object has no attribute 'gender'
当动态创建的gender属性不在__slots__中设置时,抛出异常。
本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。