python学习笔记21(类与对象的属性)

类与对象的属性

对象属性与类属性

class Person(object):
    # 这里的属性实际上属于类属性(用类名来调用)
    name = "person"
    def __init__(self, name):
        pass
        #对象属性
        self.name = name
print(Person.name)
#输出:person
per = Person("tom")
print(per.name)    #对象属性的优先级高于类属性
#输出:tom
#删除对象中的name属性,再调用会使用到同名的类属性
del per.name
print(per.name)
#输出:person

注意: 以后千万不要将对象属性与类属性重名,因为对象属性会屏蔽掉类属性。但是当删除对象属性后,再使用又能使用类属性了

动态的给对象添加对象属性

per.age = 18#只针对于当前对象生效,对于类创建的其他对象没有作用
print(per.age)
#输出:18
per2 = Person("lilei")
print(per2.age)  #没有age属性

使用types模块下的MethodType方法动态的给对象添加方法

from types import MethodType

#创建一个空类
class Person(object):
    pass

per = Person()
#动态添加属性,这体现了动态语言的特点(灵活)
per.name = "tom"
print(per.name)
#输出:tom
#动态添加方法
def say(self):
    print("my name is " + self.name)
per.speak = MethodType(say, per)
per.speak()
#输出:my name is tom

_slots_: 定义类的时候,定义一个特殊的属性(slots),可以限制动态添加的属性

#创建一个空类
class Person(object):
    __slots__ = ("name", "age", "speak")

per = Person()
per.height = 170
print(per.height)
#输出:AttributeError: 'Person' object has no attribute 'height'

在有些情况下需要对给定的外部参数进行过滤,如输入一个对象的年龄时要求输入的必须为正数,常采用限制访问的方式

class Person(object):
    def __init__(self, name, age):
        #属性直接对外暴露
        #self.age = age
        #限制访问
        self.__age = age
        self.__name = name
    def getAge(self):
        return self.__age
    def setAge(self, age):
        if age < 0:
            age = 0
        self.__age = age    

#使用限制访问,需要自己写set和get方法才能访问
per = Person("Tom",15)
print(per.getAge())
#输出:15
per.setAge(-5)
print(per.getAge())  
#输出:0 

使用@property修饰器,让你对受限制访问的属性使用点语法

class Person(object):
    def __init__(self, name, age):
        #属性直接对外暴露
        #self.age = age
        #限制访问
        self.__age = age
        self.__name = name
    @property
    def age(self):
        return self.__age
    @age.setter  #age去掉前面的双下划线,后面加.setter
    def age(self, age):
        if age < 0:
            age = 0
        self.__age = age

per = Person("Tom",15)
print(per.age) #相当于调用getAge
#输出:15
per.age = -5
print(per.age)
#输出:0

猜你喜欢

转载自blog.csdn.net/weixin_42216171/article/details/86011962