面象对象 高阶篇

静态方法@staticmethod:不可访问类中的变量与方法,唯一的关联就是通过类名去调用

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

    @staticmethod
    def eat(name):
        print("%s is eating" % name)

d = Dog("alex")
d.eat("hehe")

类方法@classmethod:只能访问类变量,不能访问实例变量

class Dog(object):
    name = "我是类变量"
    def __init__(self,name):
        self.name = name

    @classmethod
    def eat(self):
        print("%s is eating" % self.name)

d = Dog("alex")
d.eat()

 属性方法@property:把类里面的方法变成属性,其跟普通类没有关系

class Dog(object):
    name = "我是类变量"
    def __init__(self,name):
        self.name = name

    @property
    def eat(self):
        print("%s is eating" % self.name)

d = Dog("alex")
d.eat

 属性方法例子

 1 class Flight(object):
 2     def __init__(self,name):
 3         self.flight = name
 4         self.status = 1
 5 
 6     def checking_status(self):
 7         print("checking flight %s status %s" % (self.flight,self.status))
 8 
 9     @property
10     def flight_status(self):
11         if self.status == 0:
12             print("flight got canceled...")
13         elif self.status == 1:
14             print("flight is arrived...")
15         elif self.status == 2:
16             print("flight has departured already...")
17         else:
18             print("cannot confirm the flight status...,please check later")
19 
20     @flight_status.setter     # 修改属性,不添加修改属性无法直接修改
21     def flight_status(self,status):
22         self.status = status
23         print("flight status change %s" % self.status)
24 
25     @flight_status.deleter     # 删除属性
26     def flight_status(self):
27         del self.status
28         print("status got remove....")
29 
30 f = Flight("CA980")
31 
32 f.flight_status
33 
34 f.flight_status = 2
35 
36 f.checking_status()
37 
38 f.flight_status
39 
40 del f.flight_status
41 
42 # f.flight_status
View Code

类中特殊成员方法

__doc__ : 类的描述信息

__module__ : 当前操作的对象在哪个模块

__class__ : 当前操作的对象的类名

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

__del__ : 析构方法,当对象在内存中被释放时自动触发执行(解释器进行垃圾回收时自动执行)

__call__ : 对象后加(),触发执行(由对象后加括号触发的,即:对象() 或者 类()())

 1 class Foo(object):
 2     def __init__(self):
 3         pass
 4 
 5     def __call__(self, *args, **kwargs):
 6         print("__call__")
 7 
 8     def talk(self):
 9         print("talk")
10 obj = Foo()
11 print(obj)
12 obj()
13 obj.talk()
__call__

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

 1 class Province(object):
 2     country = "China"
 3     def __init__(self,name,count):
 4         self.name = name
 5         self.count = count
 6 
 7     def func(self,*args,**kwargs):
 8         print('func')
 9 
10 print("\033[32;1mProvince:\033[0m",Province.__dict__)   # 获取类的成员,静态字段、方法
11 
12 
13 obj1 = Province("alex",300)
14 print("\033[32;1mobj1:\033[0m",obj1.__dict__)    # 获取obj1对象成员
__dict__

__str__ : 类中定义了__str__方法,打印对象时输出__str__的返回值

 1 class Foo(object):
 2     def __str__(self):
 3         return 'alex Li'
 4     def talk(self):
 5         return "talk"
 6 
 7 
 8 class Dog(object):
 9     def talk(self):
10         return "talk"
11 
12 obj = Foo()
13 print(obj)
14 
15 d = Dog()
16 print(d)
__str__

__getitem__、__setitem__、__delitem__ : 索引操作,如字典。分别表示获取、设置、删除

class Foo(object):
    def __getitem__(self, item):
        print('__getitem__',item)

    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']   # 触发__delitem__

python 中一切皆对象,类对象是type类的一个实例,创建类特殊方式 :

type第一个参数:类名
type第二个参数:当前类的基类
type第三个参数:类的成员
创建类的特殊方式

__new__ : 在__init__之前执行

__metaclass__ : 用来表示该类由 谁 来实例化创建

 1 class MyType(type):
 2     def __init__(self,*args,**kwargs):  # 构造方法
 3 
 4         print("Mytype __init__")
 5 
 6     def __call__(self, *args, **kwargs):
 7         print("Mytype __call__")
 8         obj = self.__new__(self)
 9         print("obj ",obj)
10         print(self)
11         self.__init__(obj,*args, **kwargs)
12         return obj
13 
14     def __new__(cls, *args, **kwargs):
15         print("Mytype __new__")
16         return type.__new__(cls, *args, **kwargs)
17 
18 
19 class Foo(object,metaclass=MyType):  # 表示由MyType这个类来实例化Foo类
20     def __init__(self,name):
21         self.name = name
22         print("Foo __init__")
23 
24     def __new__(cls, *args, **kwargs):
25         print("Foo __new__",cls)
26         return object.__new__(cls)
27 
28 f = Foo("Alex")
29 print("f",f)
30 print("f.name",f.name)
__new__\__metaclass__

类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__

反射

getattr : getattr(object, name[, default]) -> value

hastattr : 判断对象中有没有与字符串对应的方法或属性

setattr : setattr(x, 'y', v)   ==》 "x.y = v''

delattr : 删除成员变量 delattr(x,y)

 1 class Foo(object):
 2     def __init__(self):
 3         self.name = 'alex'
 4 
 5     def func(self):
 6         return 'func'
 7 
 8 
 9 obj = Foo()
10 
11 print(hasattr(obj,'name'))  # 判断obj是否存在name属性或方法
12 print(getattr(obj,'func'))   # 获取name属性的值、func方法是获取内存地址
13 
14 setattr(obj,'age',18)    # 设置obj中的age属性,如果有会对其相应的值进行更改
15 print(obj.age)
16 
17 delattr(obj,'name')    # 删除obj中的name属性
18 print(hasattr(obj,'name'))
反射

动态导入模块

动态导入模块方法1: __import__ 

说明:

  1. 函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。

  2. __import__(module)相当于import module

举例说明:

首先创建一个模块目录lib,然后在目录内创建一个模块为:aa.py

模块代码为:

class c(object):
def __str__(self):
return 'C language'

在lib目录平级新建一个测试的模块,使用 __import__ 动态以字符串形式导入lib下的aa模块。

lib = __import__('lib.aa') # 相当于import lib
c = lib.aa.c()
print(c)

动态导入模块方法2:import importlib

实例还是上面的lib.aa模块,这里使用importlib进行动态导入(这个方法好理解,也是官方建议使用的)

import importlib
aa = importlib.import_module('lib.aa')
c = aa.c()
print(c)

补充知识
isinstance(obj,cls): 检查obj是否为cls的对象
issubclass(sub,super): 检查sub是否super类的派生类
 1 class Foo(object):
 2     def __init__(self):
 3         self.name = 'alex'
 4 
 5     def func(self):
 6         return 'func'
 7 
 8 class Bar(Foo):
 9     pass
10 
11 obj = Foo()
12 #
13 # print(hasattr(obj,'name'))  # 判断obj是否存在name属性或方法
14 # print(getattr(obj,'func'))   # 获取name属性的值、func方法是获取内存地址
15 #
16 # setattr(obj,'age',18)    # 设置obj中的age属性,如果有会对其相应的值进行更改
17 # print(obj.age)
18 #
19 # delattr(obj,'name')    # 删除obj中的name属性
20 # print(hasattr(obj,'name'))
21 
22 print(isinstance(obj,Foo))
23 print(issubclass(Bar,Foo))
补充知识
posted @ 2018-01-02 16:16  ︻◣_蝸犇り~  阅读(202)  评论(0编辑  收藏  举报