zoukankan      html  css  js  c++  java
  • Python 面向对象(一)

    1      类的定义和使用

    部分代码:

     1 """
     2 Description:
     3 Author:Nod
     4 Date:
     5 Record:
     6 #---------------------------------v1-----------------------------------#
     7 """
     8 
     9 class student:
    10     school='oldboyedu'
    11     def learn(self):
    12         print('is learning')
    13 
    14     def choose_course(self):
    15         print('%sis choose course'%self)
    16 
    17     #print('===========runing')    #执行类的时候会执行该代码
    18 
    19 print(student.__dict__)  #查看名称空间
    20 
    21 
    22 #
    23 print(student.school)  #类的数据属性  也就是特征
    24 print(student.learn)   #类的函数属性  也就是技能
    25 
    26 
    27 #修改
    28 student.school="Oldboyedu"
    29 print(student.school)
    30 
    31 #增加
    32 student.address='beijing'
    33 print(student.address)
    34 
    35 
    36 #删除
    37 del student.address
    38 #print(student.address)#因为删除了 所以会报错
    39 
    40 
    41 #调用函数
    42 
    43 student.choose_course('xxx') #因为有位置参数   所以必须传值
    View Code

    2  对象的定义和使用

    说明:在程序中 一定要先定义类 再产生对象
    1 调用类的过程称之为实例化
    2 得到1个返回值,即对象
    类不是真正存在 而对象是真正存在的

    对象应该有相同的功能 也应该有部分不同的功能属性部分
    如何定制对象独有的特征?

    之前我们定义类是这样的:

    为了定制独有的特征:

    ----------------------------------------------------add in 18-05-06 begin----------------------------------------

    为对象定制独有属性,Python有内置方法__init__

    def __init__(self,name,age,sex)     此处表示需要4个位置参数

    __init__调用类 实例化就触发执行

    调用类的功能称之为类的实例化,实例化分为2步骤

    stu1=Student('nod','25','F')

    1   得到1个返回值,即对象,该对象是1个空对象stu1

    2   student.__init__(stu1,'nod','25','F')   进行传递

    关于此处__init__的传递一定要好好理解

     ----------------------------------------------------add in 18-05-06 end----------------------------------------

    部分代码如下

     1 """
     2 Description:
     3 Author:Nod
     4 Date:
     5 Record:
     6 #---------------------------------v1-----------------------------------#
     7 """
     8 #之前的定义方式
     9 # class student:
    10 #     school='oldboy'
    11 #     def learn(self):
    12 #         print(' is learning')
    13 #     def choose_course(self):
    14 #         print(' is choose course')
    15 # #调用类的时候称之为实例化    会产生一个返回值  就是对象
    16 #
    17 # std1=student()
    18 # std2=student()
    19 # std3=student()
    20 
    21 
    22 #为了定制独有特征,改进的方式
    23 
    24 class student:
    25     school='oldboyedu'
    26     def __init__(self,name,age,sex):
    27         """
    28         init  会在调用类  也就是实例化的时候就会实行
    29         注意此处将Age与age区分大小写是为了区分
    30          age表示位置参数,而Age才是类当中的一个特征
    31         """
    32         self.Name=name
    33         self.Age=age
    34         self.Sex=sex
    35         """
    36         python会自动把stu1传进去
    37         stu1,'nod','25','M'
    38         self.Age=age 变成 stu1.Age=25
    39         self.Name=name变成stu1.Name=nod
    40         self.Sex=sex 变成stu1.Sex=M
    41         
    42         """
    43     def learn(self):
    44         print('is learn')
    45 
    46     def choose_course(self):
    47         print('is choose course')
    48 
    49 
    50 #   调用1个类称之为类的实例化 stu1=student('nod','25','M')
    51 #  1 得到1个返回值  就是对象 但是是一个空对象 stu1
    52 #   stu1.__init__(stu1,'nod','25','M')
    53 stu1=student('nod','25','FM')
    54 print(stu1.__dict__)   #stu1也有自己的名称空间 {'Name': 'nod', 'Age': '25', 'Sex': 'M'}
    55 
    56 stu2=student('luna','26','M')
    57 print(stu2.__dict__)
    58 
    59 #得到独有属性
    60 print(stu1.Name)
    61 print(stu2.Age)
    View Code

     上面代码错误部分修改

    3  属性查找和绑定方法

    对象本身只有数据属性
    {'Name': 'luna', 'Age': '26', 'Sex': 'M'}
    属性查找是针对类跟对象而言 如果对象 类当中都没有 在外部有的话 对象去查找也是找不到的

    1 查找一个对象属性的顺序是 先找对象自己的__dict__ 再找类的
    2 类的数据属性是所有对象共享 所有对象都指向同1个内存地址
    3对象的技能

    bound method 绑定方法
    绑定方法在类当中定义函数 函数绑定给对应的对象使用
    类中定义的函数是绑定给对象使用
    不同的对象是不同的绑定方法
    绑定给谁 就应该谁来调用 谁来调用就会把谁当做第一个参数传给对应的函数
    比如stu1.choose_course() 会把stu1传给def choose_course(self) 当中的self

    部分代码如下所示:

    """
    Description:
    Author:Nod
    Date:
    Record:18-05-05
    #---------------------------------v1-----------------------------------#
    """
    
    class student:
        school='oldboyedu'
        addr='shanghai'
        def __init__(self,name,age,sex):
            self.Name=name
            self.Age=age
            self.Sex=sex
    
        def learn(self):
            print('%s is learn'%self.Name)
    
        def choose_course(self):
            print(' is choose course')
        def pay(self,balance):
            print('%s is paying....'%self.Name)
            print('33[31;1m你的余额是%s33[0m'%balance)
    
    stu1=student('nod','25','F')
    print(stu1.Name)
    stu1.addr='changzhou' #对象新增数据属性
    print(stu1.__dict__) #对象的名称空间
    print(stu1.addr)  #如果对象当中和类当中存在相同的数据属性  会优先匹配对象当中的数据属性
    print(student.addr)
    print(stu1.school)  #查找属性的时候 会优先从对象的数据属性进行查找,如果没有找到再去类的数据当中找
    
    
    #函数属性
    print(student.choose_course)#<function student.choose_course at 0x027B5270>
    print(stu1.choose_course)#<bound method student.choose_course of <__main__.student object at 0x027C0310>>
    #bound method  绑定方法
    #类中定义的函数是绑定给对象使用 不同的对象是不同的绑定方法 绑定给谁  就应该谁来调用
    #谁来调用就会把谁当做第一个参数传给对应的函数
    #比如stu1.choose_course()  会把stu1传给def choose_course(self) 当中的self
    print('=================')
    stu1.learn()
    stu1.choose_course()
    
    
    #用类的方法实现该功能stu1.learn()
    
    student.learn(stu1)#  将stu1传给def learn(self)的时候 会将stu1的名称空间{'Name': 'nod', 'Age': '25', 'Sex': 'F', 'addr': 'changzhou'}
    #传进去,然后拿到其中的self.name显示出来
    print(stu1)
    
    #测试案例
    print('33[31;1m测试案例分割33[0m')
    stu2=student('luna','26','M')
    student.pay(stu2,'4000')
    """
    还是参照以上的解释,会将stu2的对象属性(名称空间)传给self  然后将4000传给balance
    """
    print(stu2.__dict__)   #对象的名称空间
    print(student.__dict__)  #类的名称空间

    3.1先来一段小例子:

    需求 :
    1定义1个老师类
    2定义一定的数据属性和函数方法
    3 特例:每个人都可以看到当前老师的个数


    解析 :每次实例化的时候 都会将类当中的count值加1 只有这样每个人都可以看见 如果写在__init__当中是self.count+=1的话 只会给每个实例化对象进行修改;而不是全局
    因而要写成Teacher.count+=1
    代码如下:
     1 """
     2 Description:
     3 Author:Nod
     4 Date:18-05-05
     5 Record:
     6 #---------------------------------v1-----------------------------------#
     7 """
     8 
     9 """
    10 需求 :
    11   1定义1个老师类   
    12   2定义一定的数据属性和函数方法
    13    3 特例:每个老师都可以看到当前老师的个数
    14 """
    15 #类的创建
    16 class Teacher:
    17     school='oldboyedu'
    18     count=0
    19     def __init__(self,name,age,sex,salary):
    20         #建议区分大小写  一个是函数的位置参数  一个是对象的属性
    21         self.Name=name
    22         self.Age=age
    23         self.Sex=sex
    24         self.Salary=salary
    25         Teacher.count+=1
    26     def teach(self):
    27         print('%s is teach Python'%self.Name)
    28 
    29     def salary(self):
    30         print('%s salary is %s'%(self.Name,self.Salary))
    31 
    32 #类的实例化
    33 
    34 tea1=Teacher('nod','25','F','4000')
    35 tea2=Teacher('luna','26','M',5000)
    36 
    37 
    38 tea1.teach()
    39 tea2.salary()
    40 tea1.salary()
    41 
    42 
    43 print('33[31;1m老师的个数为:%s33[0m'%Teacher.count)
    44 print(tea1.count)
    View Code

    4   类即类型   在python当中一切皆对象

    示例代码:

     1 """
     2 Description:
     3 Author:Nod
     4 Date:18-05-05
     5 Record:
     6 #---------------------------------v1-----------------------------------#
     7 """
     8 #类即类型
     9 l=[1,2,3,4]
    10 
    11 print(type(l))
    12 
    13 
    14 class Teacher:
    15     school='oldboyedu'
    16     count=0
    17     def __init__(self,name,age,sex):
    18         self.Name=name
    19         self.Age=age
    20         self.Sex=sex
    21         Teacher.count+=1
    22 
    23     def teach(self):
    24         print('%sis teach python'%self.Name)
    25 
    26 tea1=Teacher('nod','25','F')
    27 tea2=Teacher('luna','26','M')
    28 
    29 print(tea1.count)
    30 print(type(tea1))   #<class '__main__.Teacher'>
    31 
    32 print(id(tea1))
    33 print(id(tea2))
    34 
    35 Teacher.teach(tea1)
    36 l1=[1,2,3,4]
    37 l2=[3,4,5,6]
    38 #在python当中一切皆对象
    39 """
    40 list.append(l1,'l1')的时候 实际上是list.append(self) 将l1传给self 再讲值传递进去
    41 类似于l1.append('l1')
    42 """
    43 list.append(l1,'l1')
    44 list.append(l2,'l2')
    45 print(l1)
    46 print(l2)
    View Code

     

    5  对象之间的交互

     1 class Gailun:
     2     country = 'demaxia'
     3 
     4     def __init__(self, name, age, life_value, att):
     5         self.name = name
     6         self.age = age
     7         self.life_value = life_value
     8         self.att = att
     9 
    10     def attack(self, enemy):
    11         enemy.life_value -= self.att
    12 
    13 
    14 class Riwen:
    15     country = 'nocxus'
    16 
    17     def __init__(self, name, age, life_value, att):
    18         self.name = name
    19         self.age = age
    20         self.life_value = life_value
    21         self.att = att
    22 
    23     def attack(self, enemy):
    24         enemy.life_value -= self.att
    25 
    26 
    27 g1 = Gailun('nod', '24', 1000, 100)
    28 
    29 r1 = Riwen('riwen', '25', 800, 200)
    30 
    31 while True:
    32     if g1.life_value >= 0:
    33         g1.attack(r1)
    34         print('riven的生命值是%s' % r1.life_value)
    35         r1.attack(g1)
    36         print('galn的生命值是%s' % g1.life_value)
    37         if r1.life_value < 0:
    38             print('%s已经阵亡' % r1.name)
    39             break
    40     else:
    41         print('%s已经阵亡,生命值为%s' % (g1.name, g1.life_value))
    42         break
    对象之间的交互示例

    6  从代码级别看面向对象

    类就是将数据与数据的功能的结合体

    专门的功能处理专门的数据
    数据与处理数据的功能的捆绑效果

    示例代码1:

     1 class Mysqlhandler:
     2     def __init__(self,host,port,charset='utf-8'):
     3         self.Host=host
     4         self.Port=port
     5         self.Charset=charset
     6         self.conn=print(host,port,charset)
     7     def excute1(self,sql):
     8         return self.conn.excute(sql)
     9     def excute2(self,process_name):
    10         return self.conn.excute(process_name)
    11 
    12 obj=Mysqlhandler('127.0.0.1','3306')
    13 obj.excute1('select * from g_sn_status')
    14 obj.excute2('process_name')
    View Code

     示例代码2

     1 """
     2 Description:
     3 Author:Nod
     4 Date: 18-05-05
     5 Record:
     6 #---------------------------------v1-----------------------------------#
     7 """
     8 
     9 
    10 class MysqlHandler:
    11     def __init__(self, host, port, db, charset='utf-8'):
    12         self.Host = host
    13         self.Port = port
    14         self.Db = db
    15         self.Charset = charset
    16         self.conn = print(host, port, db, charset)  # 此处print模拟数据库连接
    17 
    18     def excute1(self, sql):
    19         return self.conn.excute(sql)
    20 
    21     def excute2(self, process_name):
    22         return self.conn.excute(process_name)
    23 
    24 
    25 obj1 = MysqlHandler('172.20.90.114', '3306', 'db1')
    26 obj2 = MysqlHandler('10.10.19.19', '1521', 'historydb')
    27 obj1.excute1('select * from g_sn_status')
    28 obj2.excute2('process_copy')
    示例代码2
  • 相关阅读:
    Android中实现ListView圆角效果[转]
    移动终端开发必备知识【转】
    android-supporting-multiple-devices
    Android @+id与@id的区别
    loading android
    Loading Image
    合理的薪酬策略——揭秘万达电商(3)
    Node.js的helloworld 程序
    codeforces Gravity Flip 题解
    HDU 3853 向下向右找出口问题-期望dp
  • 原文地址:https://www.cnblogs.com/nodchen/p/8996544.html
Copyright © 2011-2022 走看看