作用域
命名空间
变量或函数生效的范围
globals、locals
LEGB规则
locals(当前命名空间) -> enclosing function(外部嵌套函数命名空间) —>globals(全局变量,函数定义所在模块命名空间) --->builtins(内嵌)
python动态添加属性及方法
python可在运行过程中给 类 和 对象 绑定属性
给对象添加属性
class Person(object):
def __init__(self, newName, newAge):
super(Person, self).__init__()
self.name = newName
self.age = newAge
laowang = Person("老王","33")
print(laowang.name)
laowang.adress = "shenzhen"
print(laowang.adress)
laozhao = Person("老赵","22")
print(laozhao.adress) #此处会报错,因为上面只是给老王动态的添加了adress,跟别的Person对象没有关系
给类添加属性,用此类创建的对象都会有此属性
class Person(object):
def __init__(self, newName, newAge):
super(Person, self).__init__()
self.name = newName
self.age = newAge
laowang = Person("老王","33")
print(laowang.name)
laowang.adress = "shenzhen"
print(laowang.adress)
laozhao = Person("老赵","22")
# print(laozhao.adress)
Person.num = 100
print(laowang.num)
print(laozhao.num)
把方法绑定到对象上,让其成为实例方法
p.eat = types.MethodType(eat,p)
虽然laowang对象中的run属性已经指向了run方法,但还是错的
因为run属性指向的函数,是后来添加的,laowang.run()的时候,并没有把laowang当作第一个参数,导致了第10行的函数调用的时候,出现缺少参数的问题
import types
class Person(object):
def __init__(self, newName, newAge):
super(Person, self).__init__()
self.name = newName
self.age = newAge
def eat(self):
print("%s在吃饭"%self.name)
def run(self):
print("%s在跑步"%self.name)
laowang = Person("老王","33")
laowang.eat()
laowang.run = types.MethodType(run,laowang)
laowang.run()
运行结果:
老王在吃饭
老王在跑步
给类添加静态方法
@staticmethod
def test():
print("--------static method------")
class Person(object):
def __init__(self):
super(Person, self).__init__()
Person.test = test
p = Person()
p.test()
slots的作用
只能给slots()里规定的属性赋值,不能动态的添加其他属性不然会出错
@staticmethod
def test():
print("--------static method------")
class Person(object):
__slots__ = ("name","age")
def __init__(self):
super(Person, self).__init__()
Person.test = test
p = Person()
p.name = "xjx"
p.age = 9
#p.add = "shenzhen" 不注释会出现错误
p.test()
print(p.name)
print(p.age)