22、对象属性和类的属性


1、属性的优先级
class Person(object):
#这里的属性实际上属于类属性(用类名来调用)
name = "person"

def __init__(self, name):
pass
#对象属性
self.name = name

print(Person.name)

per = Person("tom")

#对象属性的优先级高于类属性
#per.name = "aaa"
print(per.name)

#动态的给对象添加对象属性
per.age = 18 #只针对于当前对象生效,对于类创建的其他对象没有作用
print(per.age)

print(Person.name)

#per2 = Person("lilei")
#print(per2.age) #没有age属性

#删除对象中的name属性,再调用会使用到同名的类属性

del per.name
print(per.name)

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


-----------------------------------
2、__slots__使用
from types import MethodType

#创建一个空类

class Person(object):
__slots__ = ("name", "age", "speak")

per = Person()

#动态添加属性,这体现了动态语言的特点(灵活)

per.name = "tom"
print(per.name)

#动态添加方法

def say(self):
print("my name is " + self.name)

per.speak = MethodType(say, per)
per.speak()

#思考:如果我们想要限制实例的属性怎么办?

#比如,只允许给对象添加name,age,height,weight属性

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

per.height = 179

print(per.height)

-----------------------------------------------------------
3、@property使用
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
'''

#方法名为受限制的变量去掉双下划线

@property
def age(self):
return self.__age


@age.setter #去掉下划线.setter

def age(self, age):
if age < 0:
age = 0
self.__age = age


@property
def name(self):
return self.__name


@name.setter #去掉下划线.setter
def name(self, name):
self.__name = name

per = Person("sunck", 18)

#属性直接对外暴露
#不安全,没有数据的过滤
print(per.age)

#per.age = 10
#print(per.age)

#使用限制访问,需要自己写set和get方法才能访问

#per.setAge(-15)
#print(per.getAge())


per.age = 100 #相当于调用setAge
print(per.age) #相当于调用getAge

print(per.name)

#property:可以让你对受限制访问的属性使用点语法

----------------------------------
4、运算符重载
print(1 + 2)

print("1" + "2")

#不同的类型用加分会有不同的解释

class Person(object):
def __init__(self, num):
self.num = num

#运算符重载
def __add__(self, other):
return Person(self.num + other.num)
def __str__(self):
return "num = " + str(self.num)


per1 = Person(1)
per2 = Person(2)
print(per1 + per2) #per1 + per2 ==per1.__add__(per2)j
print(per1)
print(per2)
posted @ 2020-02-18 21:12  步行-天下  阅读(219)  评论(0)    收藏  举报