python——作用域和给对象及类添加属性和方法

作用域

命名空间

变量或函数生效的范围

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)

你可能感兴趣的:(python——作用域和给对象及类添加属性和方法)