对象属性与类属性
class Person(object):
#这里的属性实际上属于类属性(用类名来调用)
def __init__(self, name):
#对象属性
self.name = name
print(Person.name)
per = Person(“Tom”)
#对象属性的优先级高于类属性
print(per.name)
#动态的给对象添加对象属性
per.age = 18#只针对于当前对象生效,对于类创建的其他对象没有作用
print(Person.name)
per2 = Person(“lilei”)
#删除对象中的name属性,再调用会使用到同名的类属性
del per.name
print(per.name)
#注意:不要将对象属性与类属性重名,因为对象属性会屏蔽掉类属性。但是当删除对象属性后,又能使用类属性了
动态给实例添加属性和方法
import 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 = 170
#print(per.height)
per.weight = 70
@property
可以允许对受限制访问的属性使用点语法
class Person(object):
def __init__(self, age):
#属性直接对外暴露
#self.age = age
#限制访问
self.__age = age
'''
def getAge(self):
return self.__age
def setAge(self):
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
per = Person(18)
#不安全,没有数据的过滤
per.age = -10
#使用限制访问,需要自己写set和get方法才能访问
#per.setAge(15)
#print(per.getAge())
per.age = 100 #相当于调用setAge
print(per.age)
运算符重载
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)
print(per1.__add__(per2))
print(per2)