• python---面向对象高级进阶


    静态方法,调用静态方法后,该方法将无法访问类变量和实例变量

     1 class Dog(object):
     2     def __init__(self,name):
     3         self.name = name
     4 
     5     def eat(self,food):
     6         print("%s is eating %s"%(self.name,food))
     7 
     8 d = Dog("Jack")
     9 d.eat("banana")
    10 
    11 #静态方法写法
    12 class Dog(object):
    13     def __init__(self,name):
    14         self.name = name
    15     @staticmethod       #静态类后,则无法调用类变量和实例变量
    16     def eat(self):  #需要传进来的是实例了,而不能调用类本身的属性
    17         print("%s is eating %s"%(self.name,"banana"))
    18 
    19 d = Dog("Alex")
    20 d.eat(d)        #传入实例化后的一个实例

    类方法,类方法后,可以访问类变量,但无法访问实例变量

     1 class Dog(object):
     2     name = "Mark"
     3     def __init__(self,name):
     4         self.name = name
     5     @classmethod
     6     def eat(self):
     7         print("%s is eating %s"%(self.name,"banana"))   #name为类变量,而非实例变量
     8 
     9 d = Dog("Alex")
    10 d.eat()
    11 #运行结果:Mark is eating banana

    属性方法,@property 调用属性方法后,该方法将是静态属性,调用不需要加(),直接调用即可

     1 class Dog(object):
     2     def __init__(self,name):
     3         self.name = name
     4         self.__food = None
     5     @property
     6     def eat(self):
     7         print("%s is eating %s"%(self.name,"banana"))
     8     @eat.setter
     9     def eat(self,food):
    10         print("set food:",food)
    11         self.__food = food
    12 
    13 d = Dog("Alex")
    14 d.eat       #属性方法输出的是属性,不需要动态调用,即不需要d.eat()

    属性方法修改,删除

    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))
        @eat.setter
        def eat(self,food):             #修改属性方法的参数
            print("set food:",food)
            self.__food = food
        @eat.deleter        #删除属性方法的参数
        def eat(self):
            del self.__food
            print("deleted!!!!!")
    
    d = Dog("Mark")
    d.eat
    d.eat = "apple"         #向属性方法种传递参数
    d.eat
    del d.eat               #删除属性方法种的参数
    d.eat

    __metaclass__,__init___,__call__,__new__方法调用

     1 # -*- coding:utf-8 -*-
     2 # LC
     3 
     4 class MyType(type):
     5     def __init__(self,*args,**kwargs):
     6         print("Mytype init",args,kwargs)
     7     def __call__(self, *args, **kwargs):
     8         print("Mytype call",args,kwargs)
     9         obj = self.__new__(self)
    10         self.__init__(obj,args,kwargs)
    11 
    12 class Foo(object):
    13     __metaclass__ = MyType      #表示该类是由谁来实例化自己的(即Foo类)
    14     def __init__(self):
    15         print("foo init")
    16     def __new__(cls, *args, **kwargs):
    17         print("foo new")
    18         return object.__new__(cls)
    19 
    20 f = Foo()
    21 #在python2或者3中,执行顺序为:__new__ ,  __init__,  __call__、
    22 #__new__优于__init__执行
    23 #__call__用于创建__new__

    反射,类的反射

     1 class Dog(object):
     2     def __init__(self,name):
     3         self.name = name
     4 
     5     def eat(self):
     6         print("%s is eating"%self.name)
     7 
     8 def bulk(self):
     9     print("%s is yelling"%self.name)
    10 
    11 
    12 d = Dog("Jack")
    13 
    14 choice = input(">>:").strip()
    15 print(hasattr(d,choice))            #表示对象中是否含有choice的属性,包含变量,方法等
    16 
    17 if hasattr(d,choice):
    18     print(getattr(d,choice))        #获取对象中的choice属性,如果是变量,则获取变量值,如果是方法,可以通过加()进行执行
    19     getattr(d,choice)()
    20 else:
    21     setattr(d,choice,bulk)          #设置对象中的choice属性,如可以新增一个变量或方法
    22     getattr(d,choice)(d)        #func = get(d,choice), func(d)
    23 d.talk(d)
    24 
    25 delattr(d,choice)               #删除对象中的choice属性,可以是变量,也可以是方法
    26 d.talk(d)

    类的特殊方法:

     1 # -*- coding:utf-8 -*-
     2 # LC
     3 
     4 #__doc__ 输出类的描述信息
     5 class Foo:
     6     '''
     7     类的描述信息
     8     '''
     9     def func(self):
    10         pass
    11 
    12 print(Foo.__doc__)
    13 
    14 
    15 #__module__ 输出当前操作的对象在那个模块
    16 #__class__  输出当前操作的对象的类是什么
    17 
    18 from lib.aa import C
    19 obj = C()
    20 print(obj.__module__)
    21 print(obj.__class__)
    22 
    23 #__call__ 对象后加括号,触发执行
    24 #构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行是由对象加括号触发的,即对象()或类()()
    25 class Dog(object):
    26     def __init__(self,name):
    27         self.name = name
    28 
    29     def __call__(self, *args, **kwargs):
    30         print("%s running call"%self.name,args,kwargs)
    31 
    32 obj2 = Dog("alex")
    33 obj2("wawawa",sex="F")
    34 
    35 
    36 #__dict__ 查看类或者对象中的成员
    37 
    38 print(Dog.__dict__)
    39 print(obj2.__dict__)
    40 
    41 #__str__  如果一个类中定义了__str__方法,则在打印对象的时候,默认输出该方法(__str__)的值
    42 class Cat(object):
    43     def __str__(self):
    44         return "str method"
    45 
    46 obj3 = Cat()
    47 print(obj3)
    48 
    49 #__getitem__,__setitem__,__delitem__  用于索引操作,如字典,分别进行获取,设置,删除数据
    50 
    51 class apple(object):
    52     def __init__(self):
    53         self.data = {}
    54     def __getitem__(self, key):
    55         print("get apple %s"%key)
    56         return self.data.get(key)
    57     def __setitem__(self, key, value):
    58         print("setting apple,%s,%s"%(key,value))
    59         self.data[key] = value
    60     def __delitem__(self, key):
    61         print("deleting apple %s"%key)
    62         del self.data[key]
    63 
    64 obj4 = apple()
    65 obj4["apple1"] = "red"
    66 obj4["apple2"] = "green"
    67 
    68 res = obj4["apple1"]
    69 print('---',res)
    70 print(obj4.data)
    71 del obj4["apple1"]
    72 res = obj4["apple2"]        #删除后则没有了。输出为None,具体是否删除,也是由__delitem__方法定义的
    73 print('---',res)
    74 
    75 
    76 #__new__
    77 class Foo(object):
    78     def __init__(self,name):
    79         self.name = name
    80 
    81 f = Foo("Jack")
    82 print(type(f))
    83 print(type(Foo))

    异常处理

     1 names = ["Alex","Jack"]
     2 dict = {}
     3 
     4 try:
     5     names[3]
     6 except IndexError as e:         #抓具体的错误类型
     7     print("ERROR !!!",e)
     8 
     9 try:
    10     names[3]
    11 except Exception as e:          #包含所有的错误类型,不建议使用,建议使用在最后抓未知错误
    12     print("ERROR !!!",e)
    13 
    14 
    15 
    16 try:
    17     dict["age"]
    18 except KeyError as e:         #抓具体的错误类型
    19     print("ERROR !!!",e)
    20 
    21 try:
    22     #dict["age"]
    23     #names[3]
    24     print(names[3])
    25 except (IndexError,KeyError) as e:  #抓取两个错误中的任意一个,代码谁先出错则执行谁
    26     print("ERROR",e)
    27 else:                           #没有错的时候执行
    28     print("all is well")
    29 
    30 finally:                        #不管有没有错,都执行
    31     print("不管有你没有错,都执行")
    32 
    33 
    34 class TestException(Exception):     #自定义异常
    35     def __init__(self,msg):
    36         self.msg = msg
    37 
    38 try:
    39     raise TestException('自定义异常')
    40 except TestException as e:
    41     print(e)

     断言,即是一种简单的判断,如果是True,则通过,如果是Fasle,则报错。

    assert type(obj.name) is int

  • 相关阅读:
    urlEncode
    rsyslog queue队列权威指南
    rsyslog的安装、使用、详解
    长连接及心跳保活原理简介
    python时间日期格式化和反格式化
    无锁编程
    如何快速定位找出SEGV内存错误的程序Bug
    ElasticSearch搜索数据到底有几种方式?
    golang string和[]byte的对比
    PHP中使用Redis长连接笔记
  • 原文地址:https://www.cnblogs.com/clv5/p/7359981.html
Copyright © 2020-2023  润新知