python给对象添加属性_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

# p.address = '北京'

# AttributeError: 'Person' object has no attribute 'address'

你可能感兴趣的:(python给对象添加属性)