python是动态语言

什么是动态语言

动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用。它是一类 在运行时可以改变其结构的语言 :例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力。例如JavaScript便是一个动态语言,除此之外如 PHP 、 Ruby 、 Python 等也都属于动态语言,而 C 、 C++ 、Java等语言则不属于动态语言。
举个小栗子

>>> class person(object):
...     def __init__(self,name,age):
...             self.name = name
...             self.age = age
... 
>>> p = person("小明",20)
>>> p.name
'小明'
>>> p.age
20
>>> p.sex = "男"
>>> p.sex
'男'
>>> dir(p)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', 
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'sex'] 
#sex为动态添加的属性
#在我们定义的person类中,定义了两个初始属性name和age。但是没有初始属性性别,我们实际上是通过了动态给实例添加了属性

添加无参函数

class Person(object):
    def __init__(self,name):
        self.name = name
    def eat(self):
        print("%s在吃..."%self.name)
def run():
    print("老王在跑...")
p = Person("老王")
p.eat()
#给对象添加方法
p.run = run
p.run()
#结果
>>> p = Person("老王")
>>> p.eat()
老王在吃...
>>> p.run = run  #给对象动态添加无参数的方法
>>> p.run()
老王在跑....
使用types.MethodType给对象添加带参数的函数
types.MethodType(方法名,实例对象)

在上面的操作中我们直接给Person绑定sex这个属性,重新实例化p后,p就有sex这个属性了!那么function呢?该如何绑定呢?

>>> import types
>>> class Person(object):
...     def __init__(self,name = None,age = None):
...             self.name = name
...             self.age = age
...     def eat(self):
...             print("%s eat food"%self.name)
... 
>>> def run(self):
...     print("%s在移动"%(self.name))
... 
>>> p = Person("dtwave")
>>> p.eat()
dtwave eat food
>>> p.run = types.MethodType(run,p) 
#把对象传入run方法中,这个时候就可以调用p对象中的name了,如果字符或者数字,这个时候也可以
>>> p.run()
dtwave在移动

既然给类添加方法,是使用类名.方法名 = xxx ,那么给对象添加一个方法也是类似的对象.方法名 = xxx
⚠️注意:P.run()这么直接调用,不会吧self参数传递给run()方法所有报错,才会用types.MethodType(run,P)方式传递self也就是person的实例p传递给run()中

使用types.MethodType给对象添加带多个参数的函数
>>> import types
>>> class Person(object):
...     def __init__(self,name = None,age = None):
...             self.name = name 
...             self.age = age
...     def eat(self):
...             print("%s eat food"% self.name)
... 
>>> def run(self,num,*args):
...     print("%s在移动%s米"%(self.name,num))
...     print(args)
... 
>>> p = Person("dtwave")
>>> p.eat()
dtwave eat food
>>> p.run = types.MethodType(run,p) #给对象添加可以接收多个参数的函数
>>> p.run(44,88,99,33)
dtwave在移动44米
(88, 99, 33)
运行的过程中给类添加静态方法和类方法

往类里动态添加方法和属性都不需要使用types.MethodType()函数

class Person(object):
    num = 100
    def __init__(self, name = None, age = None):
        self.name = name
        self.age = age
    def eat(self):
        print("%s eat food" % self.name)

@classmethod
def test1(cls):
    print("num==",cls.num)

@classmethod
def test4(cls,args):
    print("num==",cls.num)
    print(args)


@staticmethod
def test2():
    print("test2是静态方法..")       

@staticmethod
def test3(num):
    print("test3是静态方法..num==",num)   


print("添加类方法和静态方法-----------------")
Person.test1 = test1
Person.test2 = test2
Person.test3 = test3
Person.test4 = test4
#用类去调用方法
print("下面使用类调用方法-----------------")
Person.test1()
Person.test2()
Person.test3(11)
Person.test4("arg参数")

#用对象去调用方法
print("用对象去调用方法-----------------")
p = Person()
p.test1()
p.test2()
p.test3(11)
p.test4("arg参数")

运行过程中删除属性,方法
del 对象.属性名 p.run
delattr(对象,”属性名”) delattr(p,”name”)

猜你喜欢

转载自blog.csdn.net/Hash_Map_zong/article/details/82259978