验证python是动态语言,并且为类添加属性。

定义

静态语言:静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,不允许再运行过程中修改代码。
例如:C++、Java、Delphi、C#等

动态语言:动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。
例如:PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。

特点

强类型定义语言

强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
弱类型定义语言

数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
两者区别
特性

强类型语言是一旦变量的类型被确定,就不能转化的语言。
弱类型语言则反之,一个变量的类型是由其应用上下文确定的。

静态语言的优势

由于类型的强制声明,使得IDE有很强的代码感知能力,故,在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中,依托IDE对系统的开发很有保障;
由于静态语言相对比较封闭,使得第三方开发包对代码的侵害性可以降到最低

动态语言的优势

    思维不受束缚,可以任意发挥,把更多的精力放在产品本身上;
    集中思考业务逻辑实现,思考过程即实现过程;

code:实例

a =100
def test():
	print("---test")
a = test()
a()
#此时的函数test被赋值给了a,而a原来保存的是一个整型数字,之后被赋值给了函数,a的类型变了
	
class test(object):
	pass
t =test()
dir(t)
#此时t应该继承了test类的所有属性,dir(t)可以将t这个实例的所有属性打印出来,之后试着为t添加属性
t.age =188888
#为t添加了一个age属性,之后再dir(t)就可以显示出来t的所有属性,此时可以看见t的属性包含了一个age,这是原来的object类里面所没有的
为类动态添加属性
class Persong(object):
	def __init__ (self,newName,newAge):
		self.name =newName
		self.age =newAge
laowang =Person('老王来了'1000)
print(laowang.name)
print(laowang.age)
#此时尝试实例的别的属性
print(laowang.addr)
#编译器会报错,因为再初始化类的时候没有写入实例的addr属性
laowang.addr ='北京'
print(laowang.addr)


laozhao =Person('老赵',1000)
print(laozhao.addr)
#此时会报错,因为上面只是操作的一个实例,并没有对类的结构调整

给类添加属性

class Persong(object):
	def __init__ (self,newName,newAge):
		self.name =newName
		self.age =newAge
laowang =Person('老王来了'1000)
print(laowang.name)
print(laowang.age)
laowang.addr ='北京'
print(laowang.addr)
laozhao =Person('老赵',1000)
Person.num =100
#此时为类添加了一个属性
print(laowang.num)
print(laozhao.num)

添加方法

class Person(object):
	def __init__(self,newName,newAge):
		self.name=newName
		self.age =newAge
	def eat(self):
		print('%s正在吃'%self.name)
#在函数外添加一个方法,先定义一个方法

def run(self):
	print('---%sz正在跑---'%self.name)
p1 =Person('p1',10)
p1.eat()

#想为一个类添加一个方法run,如下为尝试
#错误的方法
p1.run =run
p1.run()
#虽然p1对象中,run属性已经指向了函数run但是没能传入self这个变量,这句代码还不对,因为run属性指向的函数,是后来添加的,p1.run()的时候,没有把p1当作第一个参数,导致了,后面函数调用的时候,出现了参数缺少的问题
#即此时p1已经有了自己的内存空间,而且这里没有之前类添加的属性,所以p1内部没有run属性。

正确方法:

import types
class Person(object):
	def __init__(self,newName,newAge):
		self.name=newName
		self.age =newAge
	def eat(self):
		print('%s正在吃'%self.name)

def run(self):
	print('---%sz正在跑---'%self.name)
def eat(self):
	print('---%s正在吃---')
	
p1.run =types.MethodType(run,p1)
p1.eat =types.MethodType(eat,p1)
p1.run()
p1.eat()

在这里插入图片描述上图是types的help,可以看见使用types的方法是types.MethodType(function,instance),function就是需要添加的属性,instance就是被绑定的实例
在这里插入图片描述在这里插入图片描述这么写是为了将types函数的返回值保存,实际上是已经将方法添加到了,实例里面,此时通过什么保存都是可以的,但是写p1.eat是为了统一,方便理解,并不是必须写p1.eat
注意:只有动态方法是和实例绑定静态方法和类方法绑定的是类!!!!!

静态方法(绑定的是类)

我觉得静态方法就是不能接受返回值的方法,就像动态方法里面的self,就是为了接收返回值,而静态方法不管绑定在哪个类上,都没有返回值。PS:欢迎指正

@staticmethod
#类似于装饰器
def test():
	print('----static methon--')
p.test =test
p.test()

类方法

@classmethod
def printNum(cls):
	print('----class methon---')
p.printNum =printNum
p.printNum()

如代码所示就是使用方法,简单易懂QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值