一、动态给实例添加属性和方法并使用
首先,创建一个类,并实例化一个对象
class Person(object):
pass
per = Person()
-
动态添加属性并使用
per.name = "tom" print(per.name)
-
动态添加方法并使用
需要用MethodType类
from types import MethodType def say(self): print("my name is " + self.name) per.speak = MethodType(say, per) per.speak()
-
限制动态添加的属性
eg:只允许给对象添加name、age、height、weight属性
在定义类的时候,定义一个特殊的属性(__slots__),可以限制动态添加的属性
class Person(object): __slots__ = ("name", "age", "height", "weight")
二、property
如果什么都不添加,会导致属性直接对外暴露,不安全,没有数据的过滤
使用限制访问,需要写set和get方法才能访问
class Person(object):
def __init__(self, age)
self.__age == age
def getAge(self):
return self.__age
def setAge(self, age):
if age < 0:
age = 0
self.__age = age
per = Person(18)
per.setAge(15)
print(per.getAge())
若仍想用“对象.属性名”进行赋值和访问,则方法名为受限制的变量去掉双下划线。
在访问方法前加“@property”,在赋值方法前加“@去掉双下划线.setter”
class Person(object):
def __init__(self, age)
self.__age == age
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if age < 0:
age = 0
self.__age = age
per.age = 100 #相当于调用setAge
print(per.age) #相当于调用getAge
注意:这样写的时候访问的不是一个属性,而是一个方法
三、运算符重载
不同的类型的值用加法会有不同的解释
print(1 + 2) #3
print("1" + "2") #12
类内运算符的应用
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) #num = 3,等价于print(per1.__add__(per2))
print(per1) #num = 1
print(per2) #num = 2
类似的运算还有: