python基础2-面向对象进阶

静态方法:即@staticmethod,只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性
class Dog(object):
    def __init__(self,name):
        self.name = name
    @staticmethod
    def eat(self):
        print("%s is eating %s"% (self.name,"狗粮"))
d = Dog("taidi")
d.eat(d)
taidi is eating 狗粮

类方法:只能访问类变量,不能访问实例变量
class Dog(object):
    name = "我是类变量"
    def __init__(self,name):
        self.name = name
    @classmethod
    def eat(self):
        print("%s is eating "% self.name)
d = Dog("taidi")
d.eat()

我是类变量 is eating 


属性方法:把一个方法变成一个静态属性

class Dog(object):
    def __init__(self,name):
        self.name = name
    @property
    def eat(self):
        print("%s is eating "% self.name)
d = Dog("taidi")
d.eat

taidi is eating 

  属性方法1:

解决传参问题:属性赋值

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 to food:",food)
        self.__food = food
d = Dog("taidi")
d.eat
d.eat="baozi"
d.eat

  返回:

taidi is eating None
set to food: baozi
taidi is eating baozi

 

解决传参问题:删除属性:
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 to food:",food)
        self.__food = food
    @eat.deleter
    def eat(self):
        del self.__food
        print("删完啦")
d = Dog("taidi")
d.eat
d.eat="骨头"
del d.eat

  

taidi is eating None
set to food: 骨头
删完啦

  

类的特殊成员方法:

1. __doc__  表示类的描述信息

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

  

2. __module__ 和  __class__ 

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

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

class C:

    def __init__(self):
        self.name = 'wupeiqi'
lib/aa.py
from lib.aa import C

obj = C()
print obj.__module__  # 输出 lib.aa,即:输出模块
print obj.__class__      # 输出 lib.aa.C,即:输出类
index.py

 

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

4.__del__

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

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

 

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


注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
 
    def __init__(self):
        pass
     
    def __call__(self, *args, **kwargs):
 
        print '__call__'
 
 
obj = Foo() # 执行 __init__
obj()       # 执行 __call__
View Code

 

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

class Province:
 
    country = 'China'
 
    def __init__(self, name, count):
        self.name = name
        self.count = count
 
    def func(self, *args, **kwargs):
        print 'func'
 
# 获取类的成员,即:静态字段、方法、
print Province.__dict__
# 输出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}
 
obj1 = Province('HeBei',10000)
print obj1.__dict__
# 获取 对象obj1 的成员
# 输出:{'count': 10000, 'name': 'HeBei'}
 
obj2 = Province('HeNan', 3888)
print obj2.__dict__
# 获取 对象obj1 的成员
# 输出:{'count': 3888, 'name': 'HeNan'}
View Code

 

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


class Foo:
 
    def __str__(self):
        return 'alex li'
 
 
obj = Foo()
print obj
# 输出:alex li
View Code
 

8.__getitem__、__setitem__、__delitem__


用于索引操作,如字典。以上分别表示获取、设置、删除数据


class Foo(object):
 
    def __getitem__(self, key):
        print('__getitem__',key)
 
    def __setitem__(self, key, value):
        print('__setitem__',key,value)
 
    def __delitem__(self, key):
        print('__delitem__',key)
 
 
obj = Foo()
 
result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'alex'   # 自动触发执行 __setitem__
del obj['k1']   
View Code
class Foo(object):
    def __init__(self):
        self.data = {}
    def __getitem__(self, key):
        print('__getitem__',key)
    def __setitem__(self, key, value):
        print('__setitem__',key,value)
        self.data[key] = value
    def __delitem__(self, key):
        print('__delitem__',key)
obj = Foo()
obj['name']  = 'luoliyu'
print(obj.data)

#返回:
#__setitem__ name luoliyu
#{'name': 'luoliyu'}
#

  

9. __new__ \ __metaclass__

待续...


反射:
hasattr(obj,name_str),判断一个对象obj里是否有对应的字符串name_str的方法
getattr(obj,name_str),根据字符串去获取obj对象里的对应的方法的内存地址
setattr(obj,'y',z),is equivalent to "obj.y = v"
delattr(x,y),

def bulk(self):
    print("%s is yelling ..." % (self.name))
class Dog(object):
    def __init__(self,name):
        self.name = name
    def eat(self,food):
        print("%s is eating..."% self.name,food)

d = Dog("taidi")
choice = input(">>:").strip()
print(hasattr(d,choice))
if hasattr(d,choice):
    func = getattr(d,choice)
    func("tom")
else:
    #动态装一个方法
    # setattr(d,choice,bulk)
    # d.talk(d)
    # setattr(d,choice,None)
    setattr(d,choice,22)
    print(getattr(d,choice))

  

动态导入模块:

 

class C:
    def __init__(self):
        self.name = 'lly'
lib/aa.py

 

lib = __import__("lib.aa")
print(lib)
obj = lib.aa.C()
print(obj.name)

#返回:
'''
<module 'lib' from 'C:\\Users\\Administrator\\PycharmProjects\\study_self\\OOP\\lib\\__init__.py'>
lly
'''

  

官方建议使用importlib

import importlib
aa = importlib.import_module("lib.aa")
print(aa)
print(aa.C().name)

#返回:
'''
<module 'lib.aa' from 'C:\\Users\\Administrator\\PycharmProjects\\study_self\\OOP\\lib\\aa.py'>
lly
'''

  

 



posted @ 2017-10-03 10:43  larlly  阅读(119)  评论(0)    收藏  举报