美文网首页
python——作用域和给对象及类添加属性和方法

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

作者: Jalynn葸 | 来源:发表于2018-05-08 15:11 被阅读28次

作用域

命名空间

变量或函数生效的范围

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——作用域和给对象及类添加属性和方法

    作用域 命名空间 变量或函数生效的范围 globals、locals LEGB规则locals(当前命名空间) ...

  • OC类目、延展

    类目: 定义:为现有工程中的类和系统类添加新的方法 作用:在类目中添加新的方法及属性和在原类中添加方法和属性是一样...

  • 匿名函数,面向对象

    匿名函数和使用 类 &面向对象 给对象添加属性 ——init——()方法 魔法方法

  • JavaScript第八章 BOM

    Windows对象全局作用域全局作用域中声明的变量,函数和方法都会变成windows的属性和方法窗口关系及框架每个...

  • python学习笔记-(4)面向对象

    类定义格式 添加和获取对象属性 类外面添加对象属性 类外面获取对象属性 类里面获取对象属性 魔法方法 __init...

  • typescript笔记(十三)

    类:描述了所创建的对象共同的属性和方法。 一、定义方式: class class_name { // 类作用域...

  • iOS:用delegate调用属性和方法,添加属性和方法

    delegate 本质为类增加属性和方法,可以用delegate调用未知对象的属性和方法,为已知对象添加属性和方法...

  • Javascript-BOM

    一、window对象 1、全局作用域 在全局作用域中定义的变量和函数都会变成window对象的属性和方法 区别: ...

  • Python学习

    类和对象对象=属性+方法在python中,一个对象的特征成为“属性”,对象的行为成为“方法”。类名后面跟着小括号,...

  • 面向对象的编程思想和Python的类,访问和属性,继承

    面向对象的编程思想和Python的类,类的方法和属性,实例方法这一文从面相对象的角度,介绍类的定义,类的属性和自定...

网友评论

      本文标题:python——作用域和给对象及类添加属性和方法

      本文链接:https://www.haomeiwen.com/subject/bsgkrftx.html