赞
踩
目录
Python是动态语言,动态类型语言,也是强类型语言。所以Python可以在运行时改变自身结构,动态添加/删除属性和方法。接下来将介绍Python如何动态添加属性和方法。
弄清楚了这些基本概念后,我们可以看下python的一些行为:
首先,python不倾向于对变量的类型做隐式转换,因此是一门强类型语言:
- a = 1
- b = "1"
- a < b // Type error
- a == b // false,符合==的意思,类型都不一样显然是不相等的
- 1 + 1.1 // 2.1,为了符合直觉做了隐式转换
其次,python可以在运行时改变变量的类型,因此python是一门动态类型语言:
- a = 1
- a = "1" // 不会报错
因此我们可以得知:python是一门强类型动态语言。
- class Obj(object):
- def __init__(self):
- self.name = '张亚飞'
-
- obj = Obj()
- obj.age = 23
- print(obj.age) # 23
- obj2 = Obj()
- print(obj2.age) # AttributeError: 'Obj' object has no attribute 'age'
- 由以上代码可知,Obj类有两个属性:name和age。通过[对象名.属性名]给类对象obj动态添加了对象属性addr,而Obj的另一个类对象obj2却不能调用这个属性。
- 注:通过对象名添加的对象属性,只有这个对象能使用
- Obj.score = 100
- print(obj.score) # 100
- print(obj2.score) # 100
由以上代码可知,通过[类名.属性名]给类Obj动态添加了类属性addr,Obj的类对象obj和obj2都能调用这个属性
注:通过类名添加的类属性,这个类的所有对象都能使用
类中有三种方法,实例方法,静态方法和类方法,三种方法的区别如下:
- from types import MethodType
-
-
- class Obj(object):
- # __slots__ = ('name', 'age')
-
- def __init__(self):
- self.name = '张亚飞'
-
-
- def set_score(self, score):
- self.score = score
-
-
- @staticmethod
- def static_func():
- print('static_func')
-
-
- @classmethod
- def class_func(cls):
- print('class_method')
- “““
- 类中有三种方法,实例方法,静态方法和类方法,三种方法的区别如下:
- 实例方法:需要绑定要一个对象上,第一个参数默认使用self,会把对象作为第一个参数传递进来
- 静态方法:使用装饰器@staticmethod进行定义,类和对象都可以调用,不需要默认参数
- 类方法:使用装饰器@classmethod进行定义,类和对象都可以调用,第一个参数默认使用cls,会把类作为第一个参数传递进来
- ”””
- """ 一 动态添加实例方法 """
- obj = Obj()
- obj.set_score = MethodType(set_score, obj)
- obj.set_score(99)
- print(obj.score) # 99obj2.set_score(99) # AttributeError: 'Obj' object has no attribute 'set_score'
- """
- 由以上代码可知,Obj类有一个方法:eat()方法。通过[types.MethodType(方法名, 对象名)]给类对象zhangsan动态添加了对象方法run(),同理,Obj的另一个类对象lisi不能调用这个方法
- 注:通过对象名添加的对象方法,只有这个对象能使用
- """
- """ 二 添加静态方法 """
- Obj.static_func = static_func
- Obj.static_func()
- obj.static_func()
- obj2.static_func()
- """
- 由以上代码可知,通过[类名.静态方法名]给类Obj动态添加了静态方法static_func(),Obj类的Obj对象和obj2对象都能调用这个方法
- 注:通过类名添加的静态方法,这个类及这个类的所有对象都能使用
- """
- """ 三 添加类方法 """
- Obj.class_func = class_func
- Obj.class_func()
- obj.class_func()obj2.class_func()
- """
- 由以上代码可知,通过[类名.类方法名]给类Obj动态添加了类方法class_func(),Obj类的obj对象和obj2对象都能调用这个方法
- 注:通过类名添加的类方法,这个类及这个类的所有对象都能使用
- """
通过以上内容,我们知道了如何动态的添加属性和方法。但是,如果我们想要限制class的属性该怎么办?例如:只允许Obj实例添加name和age属性。为了达到这个目的,Python允许在定义class的时候,定义一个特殊变量__slots__来限制该class能添加的属性。
- class Obj(object):
- __slots__ = ('name', 'age')
-
- obj = Obj()
- obj.name = 'zhangyafei'
- obj.age = 23
- obj.score = 99 # AttributeError: 'Obj' object has no attribute 'score'
- Obj.score = 100
- print(obj.score) # 100
- obj.score = 99 # AttributeError: 'Obj' object attribute 'score' is read-only
通过以上代码可知,__slots__对Obj类的动态添加没有限制,而Obj类对象obj不能再动态添加对象属性和方法。
对于__slot__有以下几个需要注意的地方:
Python动态语言的特性:https://www.cnblogs.com/zhangyafei/p/10170854.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。