学习python:day7

静态方法

静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法;

说了那么多,估计会有些懵逼,咱们还是直接上代码看下静态方法怎么使用吧!

1.按照正常逻辑编写代码并加上@staticmethod定义静态方法eat:


1

2

3

4

5

6

7

8

9

10

class People(object):

    def __init__(self,name):

        self.name = name

 

    @staticmethod #把eat方法变为静态方法

    def eat(self):

        print("%s is eating" % self.name)

 

= People("cc")

d.eat()

运行上面代码,我们会发现报以下错误:

TypeError: eat() missing 1 required positional argument: ‘self‘

----------eat需要一个self参数,但调用时却没有传递

so...我们可以得出一个结论:eat变成静态方法后,再通过实例调用时不会自动把实例本身当作一个参数传给self

2.解决办法:

1)调用时主动传递实例本身给eat方法,即d.eat(d)


1

2

3

4

5

6

7

8

9

10

11

class People(object):

    def __init__(self, name):

        self.name = name

    @staticmethod  # 把eat方法变为静态方法

    def eat(self):

        print("%s is eating" % self.name)

= People("cc")

d.eat(d)

#------打印输出------

#cc is eating

2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)


1

2

3

4

5

6

7

8

9

10

11

12

13

class People(object):

    def __init__(self, name):

        self.name = name

    @staticmethod  # 把eat方法变为静态方法

    def eat():

        print("%s is eating" % self.name)

= People("cc")

d.eat()

#------------------打印输出----------------

#print("%s is eating" % self.name)

#NameError: name ‘self‘ is not defined

类方法

类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法。

类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。

依然还是原来的代码,把eat变为类方法看下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

class People(object):

    def __init__(self, name):

        self.name = name

    @classmethod  # 把eat方法变为类方法

    def eat(self):

        print("%s is eating" % self.name)

= People("cc")

d.eat()

---------------打印输出-------------------

print("%s is eating" % self.name)

AttributeError: type object ‘People‘ has no attribute ‘name‘

报错说明:People没有name属性;

上面说过,类方法只能访问类变量,不能访问实例变量,而name在这里就是实例变量。

我们加上一个类变量试试:


1

2

3

4

5

6

7

8

9

10

11

12

13

class People(object):

    name = "类变量"

    def __init__(self, name):

        self.name = name

    @classmethod  # 把eat方法变为类方法

    def eat(self):

        print("%s is eating" % self.name)

= People("cc")

d.eat()

--------------------打印输出-------------------

类变量 is eating

属性方法

属性方法的作用就是通过@property把一个方法变成一个静态属性;

依然还是之前的代码,把eat方法变成静态属性看下效果:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class People(object):

    name = "请叫我类变量"

    def __init__(self, name):

        self.name = name

    @property  # 把eat方法变为静态属性

    def eat(self):

        print("%s is eating" % self.name)

= People("cc")

d.eat()

-----------------打印输出--------------------

    d.eat()

TypeError: ‘NoneType‘ object is not callable

这里报错是因为eat已经变成了一个静态方法,当然不能再使用()去调用了,我们直接调用试试:


1

2

3

4

d.eat

-------------打印输出------------

cc is eating

反射

1.反射的定义

根据字符串的形式去某个对象中操作成员

  • 根据字符串的形式去一个对象中寻找成员
  • 根据字符串的形式去一个对象中设置成员
  • 根据字符串的形式去一个对象中删除成员
  • 根据字符串的形式去一个对象中判断成员是否存在

2. 反射的函数

  • getattr(object, name[, default])

根据字符串的形式去一个对象中寻找成员


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class People(object):

    def __init__(self):

        self.name = ‘cc‘

    def eat(self):

        return ‘HI‘

= People()

ret1 = getattr(d,‘eat‘)

ret2 = getattr(d,‘name‘)

r1 = ret1()

print(r1)

print(ret2)

--------------打印输出----------------

HI

cc

  • setattr(object, name, value)

根据字符串的形式去一个对象中设置成员


1

2

3

4

5

6

7

8

9

10

11

12

class People(object):

    def __init__(self):

        self.name = ‘cc‘

    def eat(self):

        return ‘HI‘

= People()

set1 = setattr(d,‘age‘,18)

r1 = getattr(d,‘age‘)

print(r1)

-----------------------打印输出---------------------------

18

  • delattr(object, name)

根据字符串的形式去一个对象中删除成员


1

2

3

4

5

6

7

8

9

10

11

12

class People(object):

    def __init__(self):

        self.name = ‘cc‘

    def eat(self):

        return ‘HI‘

= People()

del1 = delattr(d,‘name‘)

r1 = getattr(d,‘name‘)

print(r1)

----------------打印输出-------------------

AttributeError: ‘People‘ object has no attribute ‘name‘

  • hasattr(object, name)

根据字符串的形式去一个对象中判断成员是否存在


1

2

3

4

5

6

7

8

9

10

11

12

class People(object):

    def __init__(self):

        self.name = ‘cc‘

    def eat(self):

        return ‘HI‘

= People()

h1 = hasattr(d,‘age‘)

h2 = hasattr(d,‘name‘)

print(h1,h2)

---------------打印输出-----------------

False True

异常处理

在之前学习的过程中我们会接触到各式各样的报错信息,编程过程中为了增加友好性,可以抓取相对应的错误并给出提示信息。

常用异常:


1

2

3

4

5

6

7

8

9

10

11

12

13

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

IOError 输入/输出异常;基本上是无法打开文件

ImportError 无法引入模块或包;基本上是路径问题或名称错误

IndentationError 语法错误(的子类) ;代码没有正确对齐

IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError 试图访问字典里不存在的键

KeyboardInterrupt Ctrl+C被按下

NameError 使用一个还未被赋予对象的变量

SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

TypeError 传入对象类型与要求的不符合

UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,

导致你以为正在访问它

ValueError 传入一个调用者不期望的值,即使值的类型是正确的

更多异常:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

ArithmeticError

AssertionError

AttributeError

BaseException

BufferError

BytesWarning

DeprecationWarning

EnvironmentError

EOFError

Exception

FloatingPointError

FutureWarning

GeneratorExit

ImportError

ImportWarning

IndentationError

IndexError

IOError

KeyboardInterrupt

KeyError

LookupError

MemoryError

NameError

NotImplementedError

OSError

OverflowError

PendingDeprecationWarning

ReferenceError

RuntimeError

RuntimeWarning

StandardError

StopIteration

SyntaxError

SyntaxWarning

SystemError

SystemExit

TabError

TypeError

UnboundLocalError

UnicodeDecodeError

UnicodeEncodeError

UnicodeError

UnicodeTranslateError

UnicodeWarning

UserWarning

ValueError

Warning

ZeroDivisionError

常用异常实例:

IndexError(输出指定错误信息并打印错误信息)


1

2

3

4

5

6

7

8

9

dic = [1,2]

try:

    dic[2]

except IndexError as e :

    print("i got it!\n",e)

---------------------------打印输出--------------------------

i got it!

list index out of range

KeyError(输出指定错误信息并打印错误信息)


1

2

3

4

5

6

7

8

9

10

dic = {‘name‘:‘cc‘}

try:

    dic[‘age‘]

except KeyError as e :

    print("i got it!\n",e)

---------------------------打印输出---------------------------

i got it!

 ‘age‘

ValueError


1

2

3

4

5

6

7

8

9

s1 = ‘hello‘

try:

    int(s1)

except ValueError as e:

    print (e)

---------------------------打印输出----------------------------

invalid literal for int() with base 10‘hello‘

万能异常Exception:(不建议用,不便于调试;可与异常配合使用)


1

2

3

4

5

6

7

8

9

s1 = ‘hello‘

try:

    int(s1)

except KeyError as e:

    print(‘键错误‘)

except IndexError as e:

    print(‘索引错误‘)

except Exception as e:

    print(‘错误‘)

自定义异常:


1

2

3

4

5

6

7

8

9

class ccException(Exception):

    def __init__(self,msg):

        self.msg = msg

    def __str__(self):

        return self.msg

try:

    raise ccException("我的异常")

except ccException as e:

    print(e)<span style="font-size: 14pt;"> </span>

时间: 2024-10-25 22:10:56

学习python:day7的相关文章

学习Python随想

进入大三之后进入了一周基本都是专业课的状态,虽然相比之前几个学期课时量减少了,但实际上学要学习的任务却大大增加了,而类似于Python,spss这一类的课程是之前之前并没有听说过的,但在上过两周之后发现,Python是类似于c语言一类的课程,而之前的c语言和数据结构学得并不好,所以其实在内心深处是有一丝丝的惧怕的,希望在实践课上能多做一些类似于第一次的学打代码的联系,多找找感觉. 课堂进度十分之快,时而跟得上时而跟不上,而一旦跟不上就会跟多米诺骨牌似的,影响接下来的课堂学习.在智慧云教室最大的感

【个人计划】告别英雄联盟,开始学习Python

不知不觉中接触英雄联盟已经快两年了,记得是大四那年找完工作,一下比较清闲,宿舍刚好有lol的氛围,于是乎,四个新手在何大神的带领下,走上了lol的道路.不得不说,从那以后,花费在lol上的时间太多啦,据我估计,个人玩了将近2000了吧,别看局数这么多,其实就是个渣渣,技术太菜了,这也就是我告别英雄联盟的原因啦,根本没有玩这个游戏的天赋,技术上没有一点点提高,一直就是在浪费时间罢了. 就我个人而言,1.在补兵方面,时好时坏,而且有时候性子急,不太注重前期的补兵发育,往往导致输的结局:2.游戏中大部

学习python第一天

学习Python第一天 Python小白,做Linux运维5年,纯系统运维已经不能满足日常工作需要,所以学习Linux运维开发入门级语言python 前言: Python, 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议. Python语法简洁清晰,特色之一是强制用空白符(white

重新学习python系列(一)? WTF?

重新学习python:两年前学了点python之后就一直没做做过啥项目, 基本上全忘光了,复习一下搞点事情 or |and & ord() ascii转16进制 chr()  16进制转ascii >>> u'ABC'.encode('utf-8') 'ABC' >>> u'中文'.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87' >>> 'abc'.decode('utf-8') u'abc' >&g

Python学习--Python基础语法

第一个Python程序 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: Window上在安装Python时已经已经安装了默认的交互式编程客户端,提示窗口如下: 在Python提示符中输入一下文本,然后按回车查看运行结果: print 'hello world'; 输出: hello world 脚本式编程 让我们来写一个简单的Python脚本,所有的Pytho

几条学习python的建议

熟悉python语言, 以及学会python的编码方式. 熟悉python库, 遇到开发任务的时候知道如何去找对应的模块. 知道如何查找和获取第三方的python库, 以应付开发任务. 学习步骤 安装开发环境 如果你在window下, 去下载pythonxy安装起来, 然后运行python, 进入python解释环境. 如果你在ubuntu下, 执行: sudo apt-get install python, 然后在命令行下运行python, 进入python解释环境. 学习方法 作为一名成熟的

鱼C《零基础入门学习Python》10-17节课时知识点总结

第10讲:列表:一个打了激素的数组 1. 列表都可以存放一些什么东西?  我们说 Python 的列表是一个打了激素的数组,如果把数组比喻成集装箱,那么 Python 的列表就是一个大仓库,Ta 可以存放我们已经学习过的任何数据类型. 2. 向列表增加元素有哪些方法?  三种方法想列表增加元素,分别是:append().extend() 和 insert().    3. append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?  append() 方法是将

学习python的小随笔

Python在课表中的名字是高级语言程序设计.上了两周的专业课,我想说我真的是想来学教育的,现在成了计算机了.我还想说,有没有一种可以用中文写程序的软件,有志向的大佬们赶紧弄个吧!       其实关于学习Python倒是不反感,无论是当初学习c++,还是现在学Python,都感觉这个东西挺有意思的.当你能把一个程序写出来并且运转成功之后,那种成就感是难以形容的.(哪怕是对着书敲上的)       希望老师教学中.把我们当做一个程序小白,很多老师以为学过了就精通了,可是事实不是那样.个人感觉Py

学习Python的第一课(简单的单元测试)

由于有C#开发基础,感觉学习Python应该不难,主要是一些语法了,再加上现在互联网这么发达. 感觉还是要有思路,否则学什么也只能是什么. 话不多说,简单发下这几天的学习成果吧: 第一次写博客,大家不要见笑啊 简单的语法就不多说了,随便搜搜就可以得到.() 单元测试来了: 要做两个测试: # 用于判断质数 import math def isPrime(n): print ("验证数字"+str(n)+"是否质数开始") print ("开平方:"

人在囧途——Java程序猿学习Python

引言 LZ之前其实一直对python都很好奇,只是苦于平时没有时间去了解它,因此趁着51假期这个机会,便迫不及待的开始了自己的探索.作为一个标准的Java程序猿,在了解python的过程当中,LZ遇到了很多囧事,接下来LZ就一一给大家说道说道.本文纯属看个乐子,非python教学. 囧事一:eclipse插件安装篇 由于LZ习惯了使用eclipse进行开发,因此对python的研究,还是希望可以在eclipse上进行试验.那么第一件事,自然是安装python的eclipse插件,于是百度.goo