VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python_常见内置函数(3)

1 >>> class A: 2 num = 0 #类属性 3 #类方法 4 @classmethod 5 def setNum(cls,newNum): 6 cls.num = newNum 7 #实例方法 8 def __init__(self): 9 self.age = 1 #实例属性 10 def setAge(self, newAge): 11 self.age = newAge 12 #静态方法 13 @staticmethod 14 def printInfo(): 15 print('类方法修改类属性,实例方法修改实例属性,静态方法不访问类') 16 17 18 >>> a = A() 19 >>> a.setAge(18) 20 >>> a.age 21 18 22 >>> A.setAge(18) 23 Traceback (most recent call last): 24 File "<pyshell#21>", line 1, in <module> 25 A.setAge(18) 26 TypeError: setAge() missing 1 required positional argument: 'newAge' 27 >>> A.setNum(100) 28 >>> A.num 29 100 30 >>> A.printInfo() 31 类方法修改类属性,实例方法修改实例属性,静态方法不访问类
复制代码
  • property(fget=None, fset=None, fdel=None, doc=None); @property

效果:

复制代码
 1 >>> c = C()
 2 >>> c.x = 10
 3 >>> c.x
 4 10
 5 >>> del c.x
 6 >>> c.x
 7 Traceback (most recent call last):
 8   File "<pyshell#18>", line 1, in <module>
 9     c.x
10   File "<pyshell#13>", line 5, in x
11     return self._x
12 AttributeError: 'C' object has no attribute '_x'
复制代码

方式1:

 1 >>> class C(object):
 2       def getx(self): return self._x
 3       def setx(self, value): self._x = value
 4       def delx(self): del self._x
 5       x = property(getx, setx, delx, "I'm the 'x' property.")

方式2:

复制代码
 1 >>> class C(object):
 2       @property
 3       def x(self):
 4           "I am the 'x' property."
 5           return self._x
 6       @x.setter
 7       def x(self, value):
 8           self._x = value
 9       @x.deleter
10       def x(self):
11           del self._x
复制代码
  •  super
复制代码
 1 >>> class A:
 2     def add(self, x):
 3         print(x+1)
 4         
 5 >>> class B(A):
 6     def add(self, x):
 7         super().add(x)
 8         
 9 >>> B().add(2)
10 3
复制代码
  •  globals, locals, vars([object])
复制代码
 1 >>> word = 'hello world'
 2 >>> def test(x):
 3     y = 1
 4     print(locals())
 5 
 6 >>> test(2)
 7 {'x': 2, 'y': 1}
 8 >>> globals()
 9 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'word': 'hello world', 'test': <function test at 0x0000023BE4CEEF28>}
10 >>> class A:
11     a = 1
12 
13 >>> vars(A)
14 mappingproxy({'__module__': '__main__', 'a': 1, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})
复制代码

(11)可执行对象

  • eval(source, globals=None, locals=None)
  • exec(source, globals=None, locals=None)
  • compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
复制代码
 1 >>> eval('2 * 3 + 4')
 2 10
 3 >>> exec('print("hello world")')
 4 hello world
 5 >>> eval_code = compile('2 * 3 + 4', '', 'eval')
 6 >>> eval_code
 7 <code object <module> at 0x00000269270686F0, file "", line 1>
 8 >>> eval(eval_code)
 9 10
10 >>> exec_code = compile('print("hello world")', '', 'exec')
11 >>> exec_code
12 <code object <module> at 0x0000026927074150, file "", line 1>
13 >>> exec(exec_code)
14 hello world
复制代码

 需要注意的是,exec函数和eval函数都是将用户提供的字符串作为代码执行,将无法控制代码的行为,会带来严重的安全隐患,使用的时候要慎重。

1 >>> exec('abs="xyz"')
2 >>> abs(-1)
3 Traceback (most recent call last):
4   File "<pyshell#13>", line 1, in <module>
5     abs(-1)
6 TypeError: 'str' object is not callable

报错的原因是使用exec函数将'xyz'赋值给了abs,abs不再是求绝对值的函数了。为了避免污染命名空间,在调用exec函数时,可以给它传递第二个参数——命名空间。

1 >>> scope = {}
2 >>> exec('abs="xyz"', scope)
3 >>> abs(-1)
4 1
5 >>> scope['abs']
6 'xyz'

注:参考了https://www.cnblogs.com/lucky-heng/p/10161190.html


相关教程
关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号