python高級-動態特性(20)

1、動態語⾔的定義

動態語言是在運行時肯定數據類型的語言。變量使用以前不須要類型聲明,一般變量的類型是被賦值的那個值的類型。如今比較熱門的動態語言有:Python、PHP、JavaScript、Objective-C等,而 C 、 C++ 等語言則不屬於動態語言。函數

 

2、運行的過程當中給對象綁定(添加)屬性

class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age

p = Person("小明","24")
print(p.name)
print(p.age)

運行結果爲:spa

小明
24

這裏咱們只定義了name和age兩個屬性,可是在類已經定義好了以後,咱們仍然能夠往裏面添加屬性,這就是動態語言的好處,動態的給實例綁定屬性:code

class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age

p = Person("小明","24")
print(p.name)
print(p.age)

#動態添加屬性
p.sex = ""
print(p.sex)

運行結果爲:對象

小明
24
男

 

3、運行的過程當中給類綁定(添加)屬性

class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age


P1 = Person("小明",24)
print(P1.sex)

運行結果爲:blog

Traceback (most recent call last):
  File "C:\Users\Se7eN_HOU\Desktop\test.py", line 8, in <module>
    print(P1.sex)
AttributeError: 'Person' object has no attribute 'sex'

這是程序報錯說,Person沒有sex這個屬性,咱們能夠經過給Person動態綁定屬性,解決問題繼承

class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age


P1 = Person("小明",24)
#動態給類添加屬性
Person.sex = ""
print(P1.sex)

這個時候在運行就不會出錯,並且會打印出P1.sex爲男ip

 

4、運行的過程當中給類綁定(添加)方法

class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age

    def eat(self):
        print("正在吃東西")

P1 = Person("小明",24)
P1.eat()
P1.run()

運行結果爲:it

正在吃東西
Traceback (most recent call last):
  File "C:\Users\Se7eN_HOU\Desktop\test.py", line 11, in <module>

    P1.run()
AttributeError: 'Person' object has no attribute 'run'

說明:正在吃東西打印出來了,說明eat函數被執行,可是後面報錯說沒有run這個屬性,可是我想在類建立好了之後,在運行的時候動態的添加run方法怎麼辦呢?編譯

#動態添加方法須要導入types模塊
import types
class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age

    def eat(self):
        print("正在吃東西")

#定義好須要動態添加的方法
def run(self):
    print("在跑步")
    
P1 = Person("小明",24)
#正常調用類裏面的函數
P1.eat()

#給對象動態綁定方法
P1.run = types.MethodType(run,P1)
#對象調用動態綁定的方法
P1.run()

運行結果爲:ast

正在吃東西
在跑步

打印出來「在跑步」說明run方法被正常執行了

動態綁定類方法和靜態方法

#動態添加方法須要導入types模塊
import types
class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age

    def eat(self):
        print("正在吃東西")

#定義好須要動態添加的實例方法
def run(self):
    print("在跑步")

#定義好須要動態添加的類方法
@classmethod
def dynamicClassMethod(cls):
    print("這是一個動態添加的類方法")
#定義好須要動態添加的靜態方法
@staticmethod
def dynamicStaticMethod():
    print("這是一個動態添加的靜態方法")
    
P1 = Person("小明",24)
#正常調用類裏面的函數
P1.eat()

#給對象動態綁定方法
#MethodType(參數1,參數2)
#參數1:是動態綁定哪一個方法,只寫方法名便可
#參數2:是把這個方法動態的綁定給誰
P1.run = types.MethodType(run,P1)
P1.run()

#動態綁定類方法的使用
Person.dynamicClassMethod = dynamicClassMethod
Person.dynamicClassMethod()

#動態綁定靜態方法的使用
Person.dynamicStaticMethod = dynamicStaticMethod
Person.dynamicStaticMethod()

 

總結:

  1. 給對象綁定屬性直接在使用前進行賦值使用便可
  2. 給對象動態綁定方法須要import types模塊
  3. 給對象動態綁定實例方法,須要使用type.MethodType()方法
  4. 給類添加類方法和靜態方法,也是直接在使用前賦值便可使用

 

5、運行的過程當中刪除屬性、方法

刪除的方法:

  1. del 對象.屬性名
  2. delattr(對象, "屬性名")
class Person(object):
    def __init__(self,name=None,age=None):
        self.name=name
        self.age=age

P1 = Person("小明",24)
print("---------刪除前---------")
print(P1.name)

del P1.name

print("---------刪除後---------")
print(P1.name)

運行結果爲:

---------刪除前---------
小明
---------刪除後---------
print(P1.name)AttributeError: 'Person' object has no attribute 'name'

 

6、__slots__

動態語言:能夠在運行的過程當中,修改代碼

靜態語言:編譯時已經肯定好代碼,運行過程當中不能修改

若是咱們想要限制實例的屬性怎麼辦?好比,只容許對Person實例添加name和age屬性。

爲了達到限制的目的,Python容許在定義class的時候,定義一個特殊的__slots__變量,來限制該class實例能添加的屬性:

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

p = Person()
p.name = "老王"
p.age = 40
print(p.name)
print(p.age)

#slots以外的屬性
p.sex = ""
print(p.sex)

運行結果爲:

老王
40
    p.sex = ""
AttributeError: 'Person' object has no attribute 'sex'

注意:

  • 使用__slots__要注意,__slots__定義的屬性僅對當前類實例起做用,對繼承的子類是不起做用的
相關文章
相關標籤/搜索