面向对象编程进阶

静态方法 @staticmethod

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

 

class Dog(object):

    def __init__(self,name):
        self.name=name



    @staticmethod         #静态方法跟类没什么关系  相当于普通函数
    def eat(self):            #把eat方法变为静态方法

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


d=Dog("xiaoming")

d.eat()     #这样调用会报错 

 报错如下:说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。

Traceback (most recent call last):
  File "D:/python/day7/静态方法.py", line 23, in <module>
    d.eat()
TypeError: eat() missing 1 required positional argument: 'self'

 

 

想让上面的代码可以正常工作有两种办法

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

class Dog(object):

    def __init__(self,name):
        self.name=name



    @staticmethod       
    def eat(self):

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


d=Dog("xiaoming")    

d.eat(d)     #这样调用 或者Dog.eat(d)

 

 

 

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

 

类方法

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

class Dog(object):

    name = 'jim'
    n=11111
    def __init__(self,name):
        self.name=name
self.n=None @classmethod
# 类方法只能访问类变量 不能访问实例变量 def eat(self): print("%s is eating %s" % (self.name, 'food')) d=Dog("xiaoming") print(d.n) print(d.name) #打印的是实例变量 xiaoming d.eat()

输出:

  None

  xiaoming
  jim is eating food 11111

 

 

属性方法

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

class Dog(object):


    def __init__(self,name):

        self.name=name
        self.__food = None


    @property
    def eat(self):  #把一个方法变成一个静态属性

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


d.Dog("xiaoming")

d.eat()   #这样调用会报错  说eat()方法不可调用  因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了

 

正常调用:

d = Dog("xiaoming")
d.eat
 
输出
 xiaoming is eating None

 还可以对这个属性进行赋值用 例如:

class Flight(object):
    def __init__(self,name):
        self.name=name


    def checking_status(self):

        print("checking flight %s status"%self.name)

        return 1

    @property
    def flight_status(self):

        status=self.checking_status()
        if status==0:
            print("flight has canceled")
        elif status==1:
            print("flight has arrived")
        else:
            print("cannot confirm the flight status...,please check later")

    @flight_status.setter  # 修改属性
    def flight_status(self, status):
        status_dic = {
            0: "canceled",
            1: "arrived",
            2: "departured"
        }


        print("\033[31;1mHas changed the flight status to \033[0m", status_dic.get(status))



f=Flight("东方航空")


f.flight_status
f.flight_status=2

 

 

类的特殊成员方法

1.__doc__  :表示类的描述信息

class Foo:
    """ 描述类信息 """
 
    def func(self):
        pass
 
print (Foo.__doc__)
#输出:描述类信息

 

2.__module__ 和  __class__  

__module__ 表示当前操作的对象在那个模块

__class__     表示当前操作的对象的类是什么

 

3. __init__ 构造方法,通过类创建对象时,自动触发执行

 

4. __del__  : 析构方法,当对象在内存中被释放时,自动触发执行

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,

所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

 

5. __call__  : 对象后面加括号,触发执行

class Dog(object):



    def __init__(self,name):

        self.name=name
        

    def __call__(self, *args, **kwargs):
        print(args,kwargs)


d=Dog("Jim")

d()          #对象加括号() 就执行__call__方法

 

 

6.  __dict__ 查看类或对象中的所有成员 

7.  __str__  如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值

 

class Dog(object):
   

    name='jim'

    def __init__(self,name):
        self.name=name


    def __str__(self):

       return "__str_"


d=Dog("Jim")

print(d)         #打印对象时  输出__str__方法的返回值
 

 6. __new__和 __metaclass__

 

class Foo(object):

    def __init__(self,name):
        self.name=name

    def __str__(self):

        return self.name



f=Foo("xiaoming")

print(f)
print(type(f))
print(type(Foo))   #Foo()类也是由type类实例化产生


输出:
xiaoming
<class '__main__.Foo'>
<class 'type'>

上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象

如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。

所以,f对象是Foo类的一个实例Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。

 

 

反射

通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法

def talk(self):
    print("%s is talking"%self)

class Dog(object):
    def __init__(self,name):

        self.name=name


    def eat(self):

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



d=Dog("xiao")

choice=input(">>:").strip()

print(hasattr(d,choice))   #反射 hasattr 判断一个对象里是否有对应的字符串的属性方法映射

# print(getattr(d,choice))   #相当于print(d.eat)  得到eat的内存地址
# getattr(d,choice)()        #根据字符串去获取obj对象里的对应的方法的内存地址
func=getattr(d,choice)
func()
setattr(d,choice,talk)
#相当于d.choice=talk 把talk的内存地址赋给了对象d.choice

func=getchattr(d,choice)
delattr(d,choice) func("xiaoming")
func(d)

  setattr是给一个对象添加一个新的属性

 

异常处理

在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是显示一个提示的页面,通俗来说就是不让用户看见大黄页!!!

names=['jim','lucy']
data={}
print(type(data))
s1='hello'

try:                             #异常处理
    #open('t.txt')
    # data['name']
    int(s1)
    names[2]


# except  IndexError as e :      
#     print("no names[2]",e)
#
# except KeyError as k:
#     print("key error",k)

except ValueError as e:           #python3 用as   python2.6 用
    print(e)

except Exception as e:            #抓住所有异常错误
    print("出错了",e)


else:
    print("一切正常")

finally:
    print("不管有没有错,都执行")

 python3 用as python2.6 用 ,      except ValueError , e:

 

异常种类

python中的异常种类非常多,每个异常专门用于处理某一项异常!!!

常用异常:

 

AttributeError #试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError #输入/输出异常;基本上是无法打开文件
ImportError #无法引入模块或包;基本上是路径问题或名称错误
IndentationError #语法错误(的子类) ;代码没有正确对齐
IndexError #下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError #试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C#被按下
NameError #使用一个还未被赋予对象的变量
SyntaxError #Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError #传入对象类型与要求的不符合
UnboundLocalError# 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError #传入一个调用者不期望的值,即使值的类型是正确的

 

 

 

 

 

 

更多异常:

 

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
View Code

 

 

在python的异常中,有一个万能异常:Exception,他可以捕获任意异常

 

 

自定义异常

 

class TestExceptipon(Exception):
    def __init__(self,msg):
        self.msg=msg

    def __str__(self):

        return 'asdasd'



try:
    raise TestExceptipon('我的异常')   #触发自己写的异常

except  TestExceptipon as e:
    print(e)

 

动态导入模块

 

import importlib   #动态导入模块


aa=importlib.import_module("lib.aa")    #aa为lib文件下的一个模块
 
#复制给aa

aa.test()  调aa模块里面的test()函数  

print(aa.name)

 

assert断言

 

import importlib


lib=importlib.import_module("lib.aa")


lib.test()

print(lib.name)

assert type(lib.name) is str   #断言lib.name是一个字符串就往下执行

print('ok')

print("okkk")

 

转载于:https://www.cnblogs.com/sunhao96/p/7771036.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值