• python 给对象绑定属性和方法和__slots__的使用


    # 以c语言为主是静态语言,运行之前先编译,在运行的过程中不允许编辑代码
    # 在运行的过程中,可以改变,可以添加属性,就是属于动态语言(python)


    # python动态的添加属性以及方法
    class Test(object):
    pass

    # t = Test()
    # print(dir(t))


    # 运行的过程中给对象绑定(添加)属性
    class Person(object):
      def __init__(self,newName,newAge):
        self.name = newName
        self.age = newAge
      def eat(self):
      print("---%s正在吃--"%self.name)
    # 添加属性
    # laowang = Person("老王",100000)
    # print(laowang.name)
    # print(laowang.age)
    # laowang.addr = '山东' #给对象添加属性,属性和对象绑定到了一起
    # print(laowang.addr)

    # laozhao = Person("老赵",18)
    # print(laozhao.name)
    # print(laozhao.age)
    # # print(laozhao.addr)

    # Person.num = 100 #给类添加属性,属性和类绑定到了一起
    # print(laowang.num)
    # print(laozhao.num)

    # 添加方法

    def run(self):
      print("---%s正在吃--"%self.name)


    p1 = Person("p1",10)
    p1.eat()

    # p1.run = run  #这个方法式错误的
    # p1.run() #虽然p1对象中的run属性已经指向了10行的函数,但这句代码还是不正确,因为run属性指向的函数时候来添加的,p1.run()的时候,并没有把p1当作第一个参数,导致了第10行的函数调用的时候,出现了缺少参数的问题

    # import types
    # types.MethodType() #把函数绑定到实例对象上

    import types
    p1.run = types.MethodType(run,p1)
    p1.run()

    # __slots__
    # 使用特殊的__slots__变量,来限制该class实例能添加的属性

    class Person(object):
    __slots__ = ("name","age")

    p = Person()
    p.name = "laowang"
    p.age = 18
    print(p.name)
    print(p.age)

    # laowang
    # 18

    p.address = '北京'
    print(p.address)

    # Traceback (most recent call last):
    # File "python是动态语言.py", line 101, in <module>
    # p.address = '北京'
    # AttributeError: 'Person' object has no attribute 'address'

  • 相关阅读:
    uniapp 分包加载
    input和textarea中的placeholder与光标位置不一致问题
    uniapp调取摄像头扫码和生成二维码
    uniapp分享功能加传递参数
    js将后台传递的数组添加自定义的键值对
    uniapp返回上一层级带参数
    引入的字体文件包太大
    直接给变量赋值接口数据
    富文本编辑器上传不了微信文件夹的图片,使用vue-quill-editor编辑器
    博客园样式修改
  • 原文地址:https://www.cnblogs.com/sklhtml/p/python.html
Copyright © 2020-2023  润新知