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)