python 面向对象(进阶篇)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 面向对象(进阶篇)相关的知识,希望对你有一定的参考价值。

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用

  • 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中)

  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数

  • 面向对象三大特性:封装、继承和多态

类的成员

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

字段里面有普通字段和静态字段,方法里面有普通方法和静态方法和类方法

所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。


一、字段

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

  • 普通字段属于对象

  • 静态字段属于

    字段的定义和使用

class Province(object):
    ‘‘‘
    # 静态字段
    ‘‘‘
    dizhi="广东"
    def __init__(self,name):
        ‘‘‘
        普通字段
        :param name:
        :return:
        ‘‘‘
        self.name=name

# 直接访问普通字段
obj = Province(‘深圳市‘)
print(obj.name)
# 直接访问静态字段
x=Province.dizhi
print(x)
#可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的

静态字段在内存中只保存一份
普通字段在每个对象中都要保存一份
应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段


二、方法

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

  • 普通方法:由对象调用;至少一个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("gaofushuai")
f.ord_func()

# 调用类方法
foo.class_func()

# 调用静态方法
foo.static_func()
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
不同点:方法调用者不同、调用方法时自动传入的参数不同。

三、属性  
如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种。
对于属性,有以下三个知识点:
属性的基本使用
属性的两种定义方式
1、属性的基本使用

# 定义
class foo(object):
    def func(self):
        pass
    # 定义属性
    @property
    def prop(self):
        pass
    # 调用
obj=foo()
obj.func()
obj.prop#调用属性

由属性的定义和调用要注意一下几点:

  • 定义时,在普通方法的基础上添加 @property 装饰器;

  • 定义时,属性仅有一个self参数

  • 调用时,无需括号
               方法:obj.func()
               属性:obj.prop

注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象

        属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能。

实例:对于主机列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据(即:limit m,n),这个分页的功能包括:

  • 根据用户请求的当前页和总数据条数计算出 m 和 n

  • 根据m 和 n 去数据库中请求数据 


class abc(object):
    def __init__(self,dangqianye):
        # 用户当前请求的页码(第一页、第二页...)
        self.dangqianye=dangqianye
        # 每页默认显示10条数据
        self.per_items = 10
    @property
    def start(self):
        val=(self.dangqianye-1)*self.per_items
        return val
    @property
    def end(self):
        val=self.dangqianye*self.per_items
        return val

p=abc(1)
p.start#就是起始值
p.end#就是结束值

2、属性的两种定义方式

属性的定义有两种方式:

  • 装饰器 即:在方法上应用装饰器

  • 静态字段 即:在类中定义值为property对象的静态字段

装饰器方式:在类的普通方法上应用@property装饰器

经典类,具有一种@property装饰器


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

    @property
    def price(self):
        return "wupeiqi"
# ############### 调用 ###############
obj = Goods()
result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

新式类,具有三种@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 方法


python的反射

#!/usr/bin/env python
# encoding: utf-8
"""
@version: ??
@author: phpergao
@license: Apache Licence 
@file: oopfanshe.py
@time: 2016-05-22 17:04
"""
import sys
class webserver(object):
    def __init__(self,host,port):
        self.host=host
        self.port=port
    def start(self):
        print("server is start")
    def stop(self):
        print("server is stop")
    def restart(self):
        self.start()
        self.stop()
def testrun(self,name):
    print("running.....",name,self.host)
if __name__=="__main__":
    server=webserver("127.0.0.1",22)
    server2=webserver("192.168.1.1",23)
    if hasattr(server,sys.argv[1]):
        func=getattr(server,sys.argv[1])#获取内存地址
        func()
    #delattr(webserver,"start")
    #print(server.restart())


以上是关于python 面向对象(进阶篇)的主要内容,如果未能解决你的问题,请参考以下文章

Python进阶---面向对象第三弹(进阶篇)

python 面向对象(进阶篇)

python 面向对象(进阶篇)

python 面向对象(进阶篇)

python 面向对象(进阶篇)

python 面向对象(进阶篇)