Python 面向对象

本节内容

  1. 类的成员

  2.  

 

1.类的成员

类的成员可以分为三大类:字段、方法和属性

 

1.1 字段:

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

  • 普通字段属于对象
  • 静态字段属于
  • 静态字段在内存中只保存一份
  • 普通字段在每个对象中都要保存一份
class Province:

    # 静态字段
    country = '中国'

    def __init__(self, name):

        # 普通字段
        self.name = name


# 直接访问普通字段
obj = Province('河北省')
print obj.name

# 直接访问静态字段
Province.country
字段的定义和使用

1.2 方法:

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self
  • 类方法:由调用; 至少一个cls参数;执行类方法时,自动将调用该方法的复制给cls
  • 静态方法:由调用;无默认参数;
class Foo(object):
    def __init__(self,name):
        self.name = name

    def ord_func(self):
        '''定义普通方法,至少有一个self参数'''
        # print(self.name)
        print('普通方法')
    @classmethod
    def class_func(cls):
        '''定义类方法,至少有一个cls参数'''
        print('类方法')
    @staticmethod
    def static_func():
        '''定义静态方法,无默认参数'''
        print('静态方法')
f = Foo('40kuai')
# 调用普通方法
f.ord_func()
# 调用类方法
Foo.class_func()
# 调用静态方法
Foo.static_func()
方法使用和调用方式

相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。

不同点:方法调用者不同、调用方法时自动传入的参数不同。

1.3 属性

如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种。

对于属性,有以下三个知识点:

  • 属性的基本使用
  • 属性的两种定义方式

属性的基本使用

class Foo(object):
    def func(self):
        pass
    # 定义属性
    @property
    def prop(self):
        print('属性')
        pass

foo_obj = Foo()

foo_obj.func()
foo_obj.prop  # 调用属性
属性的基本使用

新式类,具有多种@property装饰器

# ############### 定义 ###############
class Goods(object):

    @property
    def price(self):
        print '@property'

    @price.setter
    def price(self, value):
        print '@price.setter'

    @price.deleter
    def price(self):
        print '@price.deleter'

# ############### 调用 ###############
obj = Goods()

obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数

del obj.price      # 自动执行 @price.deleter 修饰的 price 方法
property的使用

 

**抽象接口**

import abc
class people(object):
@abc.abstractmethod
def talk(self,lang):
pass

**模块动态导入:**

# 可以接收字符串进行导入模块
import importlib
__import__('import_lib.metaclass') #这是解释器自己内部用的
importlib.import_module('import_lib.metaclass') #与上面这句效果一样,官方建议用这个

**反射**

# python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
class Foo(object):

def __init__(self):
self.name = 'wupeiqi'

def func(self):
return 'func'

obj = Foo()

# #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func')

# #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func')

# #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1)

# #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')

 

 

 

 

posted @ 2017-03-24 17:34  40块钱抓娃娃  阅读(218)  评论(0编辑  收藏  举报