本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。
目录
对象属性与类属性
类属性
创建Person类,设置一个name属性;
这时不进行实例化就可以直接通过类名获取属性,
这就是类属性。
示例如下:
            
            
              python
              
              
            
          
          class Person(object):
    # 这里的属性为类属性 通过类名来调用
    name = 'Person'
print(Person.name)
# 执行结果
# Person对象属性
在类实例化为对象时,赋值或添加的属性为对象属性(不会改变原有类属性值)。
示例如下:
            
            
              python
              
              
            
          
          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)执行结果:
            
            
              bash
              
              
            
          
          Person
small cat
Person通过执行结果可以看出,实例化后赋值的name属性与类属性name并不相同,
最终也并没有通过赋值改变原有类属性的值。
属性优先级
对象属性优先级高于类属性。
场景:当Person对象未设置name属性时调用原有类属性值;
如果设置了对象属性,则调用对象属性值。
示例如下:
            
            
              python
              
              
            
          
          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)执行结果:
            
            
              bash
              
              
            
          
          Person
Person
张三删除对象中的name属性,在调用会用到同名的类属性。
示例如下:
            
            
              python
              
              
            
          
          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)执行结果:
            
            
              bash
              
              
            
          
          Person
small cat
Person动态对象属性只针对当前对象
动态给对象添加对象属性,只针对当前对象生效,对于类创建的其他对象没有作用。
示例如下:
            
            
              python
              
              
            
          
          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)执行结果:
            
            
              bash
              
              
            
          
          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注意:以后千万别说对象属性与类属性重名,因为对象属性会屏蔽掉类属性。但是当删除对象属性后,在使用又能使用类属性了。
动态添加属性和方法
实例化对象后可进行动态添加属性和方法。
动态添加属性
创建一个空类,动态添加属性。
示例如下:
            
            
              python
              
              
            
          
          class Person(object):
    pass
p1 = Person()
p1.name = '张三'
print(p1.name)执行结果:
            
            
              bash
              
              
            
          
          张三动态添加属性,体现了动态语言的特点(灵活)
动态添加方法
引入方法参数处理库
            
            
              python
              
              
            
          
          from types import MethodType添加方法
在动态添加方法时,需要对方法的参数进行处理,否则会抛出self异常。
示例如下:
            
            
              python
              
              
            
          
          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()执行结果:
            
            
              bash
              
              
            
          
          张三
我的名字叫:张三限制动态添加属性
比如只允许给对象添加name,age,height,weight属性
解决:定义类的时候,定义一个特殊属性(slots),可以限制动态添加的属性。
__slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。
示例如下:
            
            
              python
              
              
            
          
          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)执行结果:
            
            
              python
              
              
            
          
          张三
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 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。