面向对象的类成员(特殊方法)

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

 

posted @ 2016-11-24 16:15  橡皮头  阅读(247)  评论(0编辑  收藏  举报