zoukankan      html  css  js  c++  java
  • 面向对象的类成员(特殊方法)

    isinstance(对象,类名)   #判断该对象是否是该类及其父类的实例

    issubclass(类名,类名)   #判断前类是否是后类的子类

    面向对象的类成员:1、方法  2、属性  3、字段

    字段:

      普通保存在对象中

      静态保存在类中

    class Foo:
        cc = 123                  #静态字段
        def __init__(self):
            self.name = "Guido"  #字段,(普通字段)
        def show(self):
            print(self.name)
    
    class province:
        country = "中国"            #静态字段在内存中只保存一份就行,在代码加载时已经创建。
        def __init__(self, name):
            self.name = name
    #一般情况自己访问自己的字段,普通字段只可以通过对象访问。
    hn = province("河南")
    hb = province("河北")
    print(hn.name)                  #用对象访问
    print(province.country)         #用类访问
    print(hn.country)               #通过对象也可以访问静态字段(不到万不得已不要用)
    
    class province:
        country = "中国"
        def __init__(self, name):
            self.name = name
    
    
        def f2(self, name):
            print("cls")
            print(name)
    ret = province("Guido")
    ret.f2(ret.name)                #(对象.传入的参数变量)才能使用__init__里的参数。
    
    
    #执行结果:
    cls
    Guido
    

      

    静态方法:

    class province:
        country = "中国"
        def __init__(self, name):
            self.name = name
    # 普通方法由对象去调用执行(方法属于类)
        def show(self):
            print(123)
            print(self.name)
    ret = province("Guido")
    ret.show()
    
    
    class province:
        country = "中国"
        def __init__(self, name):
            self.name = name
    #静态方法
        @staticmethod
        def  f1(arg1, arg2, arg3):      #可以无参数
            print(arg1, arg2, arg3)     #静态方法,由类调用执行,相当于属于该类的函数
    ret = province("Guido")
    province.f1(11, province.country, ret.name)
    
    
    
    
    class province: 
      country = "中国" 
      def __init__(self, name): 
        self.name = name 
      #类方法(属于静态方法) 
      @classmethod 
      def f2(cls):                              #class至少有一个参数cls
        print(cls)                            #cls是类名,cls()创建对象 
    
    province.f2()                                #不用传实际参数,cls自动传入类名
    

      

    属性:

      不伦不类的东西,具有方法的写作形式,且具有字段的访问形式。

    class pager:
        def __init__(self, all_count):
            self.all_count = all_count
        def all_pager(self):
            a1, a2 = divmod(self.all_count, 10)   #分页
            if a2 == 0:
                return a1
            else:
                return a1+1
    p = pager(101)
    print(p.all_count)          #执行字段
    result = p.all_pager()      #执行方法
    print(result)
    
    
    class pager:
        def __init__(self, all_count):
            self.all_count = all_count
        @property
        def all_pager(self):
            a1, a2 = divmod(self.all_count, 10)   #分页
            if a2 == 0:
                return a1
            else:
                return a1+1
    p = pager(101)
    ret = p.all_pager       #利用属性执行@property在下面的方法
    print(ret)
    
    
    
    
    class pager:
        def __init__(self, all_count):
            self.all_count = all_count
        @property
        def all_pager(self):
            a1, a2 = divmod(self.all_count, 10)   #分页
            if a2 == 0:
                return a1
            else:
                return a1+1
        @all_pager.setter
        def all_pager(self, value):
            print(value)
    
        @all_pager.deleter
        def all_pager(self):
            print("del all_pager")
    p = pager(101)
    print(p.all_count)
    p.all_count = 102
    del p.all_count
    
    p.all_pager = 111       #利用属性执行@all_pager.setter下面的方法
    del p.all_pager         #利用属性执行@all_pager.deleter下面的方法
    

     以上@的方式只是提供一种上下的对应关系。

    属性的另一种方式:

    class pager:
        def __init__(self, all_count):
            self.all_count = all_count
        def f1(self):
            return 123
        def f2(self, value):
            print(value)
        def f3(self):
            print("jjjj")
        foo = property(fget = f1, fset = f2, fdel = f3)
    p = pager(101)
    result = p.foo         #对应执行f1
    print(result)
    p.foo = "Guido"       #对应执行f2
    del p.foo             #对应执行f3
    

     特殊的类成员:

    class Foo:
        #构造方法(但对象建立成功就会立刻执行此方法)
        def __init__(self, name, age):
            self.name = name
            self.age = age
        #析构方法(在垃圾回收机制执行前执行)(在python程序结束前会自动调用__del__方法)
        def __del__(self):
            pass
        def __call__(self):
            print("call")
    #用print打印对象就会自动执行__str__方法 def __str__(self): return "%s - %d" %(self.name, self.age) obj = Foo() obj() #对象() 执行call Foo() obj1 = Foo("Guido",22) obj2 = Foo("alex",23) print(obj1) print(obj2) ret = str(obj1) #无__str__方法,该操作不对内部进行字符串的转换 print(ret) #用print打印对象就会自动执行__str__方法
    class Foo:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def __add__(self, other):
            temp = "%s - %d" %(self.name, other.age)          #__init__里封装的参数
            return temp
        
    obj1 = Foo("alex", 34)
    obj2 = Foo("eric",23)
    
    ret = obj1+obj2     #obj1+obj2 return temp, temp = ret
    print(ret)
    
    #获取对象中封装的数据
    ret = obj1.__dict__
    print(ret)
    print(Foo.__dict__)
    
    
        def __getitem__(self, item):
            print(item)
            return 123
        def __setitem__(self, key,value):
            print("setitem")
        def __delitem__(self, key):
            print("delitem")
    obj = Foo("alex", 32)
    #语法对应关系
    ret = obj["ad"]      #执行__getitem__
    print(ret)
    obj["K1"] = 11       #执行__setitem__
    del obj["K1"]        #执行__delitem__
    ret1 = obj[1:4]      #执行__getitem__
    
    class Foo:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def __getitem__(self, item):
            print(type(item),item)
            print(item.start, item.stop, item.step)
            return 123
        def __setitem__(self, key, value):
            print(key.start, key.stop, key.step)
            print(type(key),type(value))
        def __delitem__(self, key):
            print(key.start, key.stop, key.step)
            print(type(key))
    obj = Foo("alex", 22)
    ret = obj[1:4:2]                        #执行__getitem__
    obj[1:4] = [11,22,33,44,55]     #执行__setitem__
    del obj[1:4]                              #执行__delitem__
    
    
    #执行结果:
    (<type 'slice'>, slice(1, 4, 2))
    (1, 4, 2)
    (1, 4, None)
    (<type 'slice'>, <type 'list'>)
    (1, 4, None)
    <type 'slice'>
    class Foo:
        pass
    obj = Foo()
    for item in obj:        #报错(对象默认是不可迭代的)
        print(item)
    
    class Foo:
        def __iter__(self): #就是一个生成器
            yield 1         #还可以return iter([11,22,33,44])
            yield 2
    obj = Foo()
    for item in obj:
        print(item)


    #执行结果:
    1
    2
  • 相关阅读:
    .NET框架程序设计三个概念:.NET,.NET平台(PlatForm),.NET框架(Framework)
    解决AVI格式的文件不能删除的问题
    加载项目失败的解决办法
    由Codebehind所引发的
    由Duwamish学习web.config的配置
    JDK、JRE、JVM之间的关系
    hadoop等的下载地址
    eclipse代码自动补全
    UML 类图中的几种关系
    fedora 14 的163的yum源
  • 原文地址:https://www.cnblogs.com/Guido-admirers/p/6098281.html
Copyright © 2011-2022 走看看