当前位置:   article > 正文

Python动态语言的特性_python是典型的强类型动态语言,是在运行时可以改变自身结构的语言

python是典型的强类型动态语言,是在运行时可以改变自身结构的语言

目录

1 动态语言相关概念

1.1 动态语言

1.2 动态类型语言

1.3 强类型语言

2 动态添加属性

 2.1 添加对象属性

2.2 添加类属性

2 动态添加方法

4 __slots__的使用


1 动态语言相关概念

1.1 动态语言

  • 在运行时代码可以根据某些条件改变自身结构
  • 可以在运行时引进新的函数、对象、甚至代码,可以删除已有的函数等其他结构上的变化
  • 常见的动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang

1.2 动态类型语言

  • 在运行期间检查数据类型的语言
  • 数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段
  • 常见的动态类型语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl

1.3 强类型语言

  • 一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型
  • 常见的强类型语言:Java、C#、Python、Object-C、Ruby

Python是动态语言,动态类型语言,也是强类型语言。所以Python可以在运行时改变自身结构,动态添加/删除属性和方法。接下来将介绍Python如何动态添加属性和方法。

1.4 为什么说 Python 是强类型语言?

  • 强类型:如果一门语言倾向于不对变量的类型做隐式转换,那我们将其称之为强类型语言
  • 弱类型:相反,如果一门语言倾向于对变量的类型做隐式转换,那我们则称之为弱类型语言
  • 动态类型:如果一门语言可以在运行时改变变量的类型,那我们称之为动态类型语言
  • 静态类型:相反,如果一门语言不可以在运行时改变变量的类型,则称之为静态类型语言

弄清楚了这些基本概念后,我们可以看下python的一些行为:

首先,python不倾向于对变量的类型做隐式转换,因此是一门强类型语言:

  1. a = 1
  2. b = "1"
  3. a < b // Type error
  4. a == b // false,符合==的意思,类型都不一样显然是不相等的
  5. 1 + 1.1 // 2.1,为了符合直觉做了隐式转换

其次,python可以在运行时改变变量的类型,因此python是一门动态类型语言:

  1. a = 1
  2. a = "1" // 不会报错

因此我们可以得知:python是一门强类型动态语言。

2 动态添加属性

 2.1 添加对象属性

  1. class Obj(object):
  2. def __init__(self):
  3. self.name = '张亚飞'
  4. obj = Obj()
  5. obj.age = 23
  6. print(obj.age) # 23
  7. obj2 = Obj()
  8. print(obj2.age) # AttributeError: 'Obj' object has no attribute 'age'

 

  1. 由以上代码可知,Obj类有两个属性:name和age。通过[对象名.属性名]给类对象obj动态添加了对象属性addr,而Obj的另一个类对象obj2却不能调用这个属性。
  2. 注:通过对象名添加的对象属性,只有这个对象能使用

2.2 添加类属性

  1. Obj.score = 100
  2. print(obj.score) # 100
  3. print(obj2.score) # 100

 由以上代码可知,通过[类名.属性名]给类Obj动态添加了类属性addr,Obj的类对象obj和obj2都能调用这个属性

    注:通过类名添加的类属性,这个类的所有对象都能使用

2 动态添加方法

类中有三种方法,实例方法,静态方法和类方法,三种方法的区别如下:

  • 实例方法:需要绑定要一个对象上,第一个参数默认使用self,会把对象作为第一个参数传递进来
  • 静态方法:使用装饰器@staticmethod进行定义,类和对象都可以调用,不需要默认参数
  • 类方法:使用装饰器@classmethod进行定义,类和对象都可以调用,第一个参数默认使用cls,会把类作为第一个参数传递进来
  1. from types import MethodType
  2. class Obj(object):
  3. # __slots__ = ('name', 'age')
  4. def __init__(self):
  5. self.name = '张亚飞'
  6. def set_score(self, score):
  7. self.score = score
  8. @staticmethod
  9. def static_func():
  10. print('static_func')
  11. @classmethod
  12. def class_func(cls):
  13. print('class_method')
  14. “““
  15. 类中有三种方法,实例方法,静态方法和类方法,三种方法的区别如下:
  16. 实例方法:需要绑定要一个对象上,第一个参数默认使用self,会把对象作为第一个参数传递进来
  17. 静态方法:使用装饰器@staticmethod进行定义,类和对象都可以调用,不需要默认参数
  18. 类方法:使用装饰器@classmethod进行定义,类和对象都可以调用,第一个参数默认使用cls,会把类作为第一个参数传递进来
  19. ”””
  20. """ 一 动态添加实例方法 """
  21. obj = Obj()
  22. obj.set_score = MethodType(set_score, obj)
  23. obj.set_score(99)
  24. print(obj.score) # 99obj2.set_score(99) # AttributeError: 'Obj' object has no attribute 'set_score'
  25. """
  26. 由以上代码可知,Obj类有一个方法:eat()方法。通过[types.MethodType(方法名, 对象名)]给类对象zhangsan动态添加了对象方法run(),同理,Obj的另一个类对象lisi不能调用这个方法
  27. 注:通过对象名添加的对象方法,只有这个对象能使用
  28. """
  29. """ 二 添加静态方法 """
  30. Obj.static_func = static_func
  31. Obj.static_func()
  32. obj.static_func()
  33. obj2.static_func()
  34. """
  35. 由以上代码可知,通过[类名.静态方法名]给类Obj动态添加了静态方法static_func(),Obj类的Obj对象和obj2对象都能调用这个方法
  36. 注:通过类名添加的静态方法,这个类及这个类的所有对象都能使用
  37. """
  38. """ 三 添加类方法 """
  39. Obj.class_func = class_func
  40. Obj.class_func()
  41. obj.class_func()obj2.class_func()
  42. """
  43. 由以上代码可知,通过[类名.类方法名]给类Obj动态添加了类方法class_func(),Obj类的obj对象和obj2对象都能调用这个方法
  44. 注:通过类名添加的类方法,这个类及这个类的所有对象都能使用
  45. """

4 __slots__的使用

  通过以上内容,我们知道了如何动态的添加属性和方法。但是,如果我们想要限制class的属性该怎么办?例如:只允许Obj实例添加name和age属性。为了达到这个目的,Python允许在定义class的时候,定义一个特殊变量__slots__来限制该class能添加的属性。

  1. class Obj(object):
  2. __slots__ = ('name', 'age')
  3. obj = Obj()
  4. obj.name = 'zhangyafei'
  5. obj.age = 23
  6. obj.score = 99 # AttributeError: 'Obj' object has no attribute 'score'
  7. Obj.score = 100
  8. print(obj.score) # 100
  9. obj.score = 99 # AttributeError: 'Obj' object attribute 'score' is read-only

 

通过以上代码可知,__slots__对Obj类动态添加没有限制,而Obj类对象obj不能再动态添加对象属性和方法。

对于__slot__有以下几个需要注意的地方:

  • __slots__只对类对象进行限制,不对类进行限制
  • __slots__不仅限制类对象的属性,还限制类对象的方法
  • __slots__仅对当前类起作用,对继承的子类不起作用
  • 在子类中定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的__slots__

 

Python动态语言的特性https://www.cnblogs.com/zhangyafei/p/10170854.html

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/115945
推荐阅读
相关标签
  

闽ICP备14008679号