面向对象

1、面向过程与面向对象:
面向过程:核心是过程二字,过程即解决问题的步骤,就是先干什么再干什么
基于该思想写程序就好比在设计一条流水线,是一种机械式的思维方式
优点:复杂的过程流程化,进而简单化
缺点:可扩展性差

面向对象:核心是对象二字,对象是特征和技能的结合体
基于该思想写程序就好比创造一个世界,世界是多个对象组成的,是一种上帝的思维方式
优点:可扩展性强
缺点:编程复杂程度高,容易出现过度设计

2、类:
对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
在现实世界中:一定是先有的一个个具体存在的对象,后总结出的类
在程序中:一定保证先定义类,后产生对象

类的简单定义和使用
class Student:
        school='oldboy'
        def learn(self):
            print('learn')
        def choose_course(self):
            print('choose_course')
        # print('--->')
#查看属性:
print(Student)
print(Student.choose_course)
print(Student.school)   #类的数据属性
print(Student.learn)    #类的函数属性

print(Student.__dict__) #查看类的名称空间
#增加属性:
Student.country='china'
print(Student.country)

#修改属性:
Student.school='oldboydd'
print(Student.school)

#删除属性:
del Student.country
print(Student.country)

#类中函数的调用
#由于类中定义的函数都是需要传值的,所以在这里可以任意传入一个值就能执行类中的函数
print(Student.learn('sadf'))
类中对象的定义及其使用
class Student:
    school = 'oldboy'
    def __init__(self,name,sex,age):  #python自带的,会自动调用
        self.Name=name
        self.Sex=sex
        self.Age=age

        # stu1.Name='lqx'
        # stu1.Sex=sex
        # stu1.Age=18
    def learn(self):
        print('learn')

    def choose_course(self):
        print('choose_course')

#调用类的过程又称为实例化,stu1=Student('lqx','male','18')
#1、得到一个返回值,即对象,该对象是一个空对象stu1
#2、Student.__init__(stu1,'lqx','male','18'),
#总结:实例化,先造出一个空对象,然后把空对象和连同调用类时需要的参数一同传入init的函数,同时空对象一定在第一位

#调用类,实例化出对象:
stu1=Student('lqx','male','18')
# stu2=Student()
# stu3=Student()
#查看对象的值
print(stu1.__dict__)   #查看stu1会有自己的一个名称空间,使用__dict__就可看到对象下面的值
print(stu1.Name,stu1.Age,stu1.Sex)
#改对象的值
stu1.Name='www'
print(stu1.Name,stu1.Age,stu1.Sex)


stu2=Student('yft','male','12')
print(stu2)
print(stu1,stu2)
属性查找与绑定方法

class Student:
    school='oldbody'

    def __init__(self,name,sex,age):
        self.name=name   #给self.name赋值
        self.sex=sex
        self.age=age

    def learn(self,x,y):
        print('%s learn' %stu1.name)
        print(x,y)
    def choose_course(self):
        print('choose_course')
1、查找一个对象的属性顺序是:先找对象自己的dict,再找类的dict

stu1=Student('lqx','male',18)
stu2=Student('yft','male',20)

2、类的数据属性是所有对象共享的,所有对象都指向同一个内存地址

属性的查找,先从对象自己的名称空间去找,如果没有再去类的名称空间去找。如果再没有就会报错

#类下面应的school的名称空间和对象下面对应的school的名称空间是相同的
stu1.school='xxx'
print(Student.school,id(Student.school))
print(stu1.school,id(stu1.school))
print(stu2.school,id(stu2.school))
3、类中定义的函数是绑定给对象使用的

3.1、不同对象就是对应不同绑定方法
3.2、绑定给A,就应该由A来调用,A来调用就会把A当做第一个参数传给对应的函数

print(Student.learn)  #类去访问就是普通函数function
print(stu1.learn)   #对象去访问被称为bound method
print(stu2.learn)

stu1.learn(1,2)  #自动把stu1传入函数 等同于 student.learn(stu1,1,2)
4、小练习:统计被实例化的次数
class Teacher:
    shool='oldbody'
    count=0
    def __init__(self,name,sex,age,level,salary):
        self.name=name
        self.sex=sex
        self.age=age
        self.level=level
        self.salary=salary
        Teacher.count+=1   #count的属性应该是Teacher 类的属性(全局的),才能让全部的对象都能使用

    def teach(self):
        print('%s teach' %self.name)

stu1=Teacher('egon','male','23','10','2000')
stu2=Teacher('www','male','25','30','4000')
print(stu1.count)
# print(stu2.count)
类与类之间的相互调用
class Garen:
    camp='demacia'
    def __init__(self,nickname,life_value,aggresivity):
        self.nickname=nickname
        self.life_value=life_value
        self.aggresivity=aggresivity

    def attack(self,enemy):
        enemy.life_value-=self.aggresivity


class Riven:
    camp = 'Noxus'

    def __init__(self, nickname, life_value, aggresivity):
        self.nickname = nickname
        self.life_value = life_value
        self.aggresivity = aggresivity

    def attack(self, enemy):
        enemy.life_value -= self.aggresivity

g1=Garen('盖伦',1000,100)
r1=Riven('瑞文',200,500)

print(g1.life_value)
r1.attack(g1)
print(g1.life_value)
类即类型
#类型dict就是类dict
>>> list
<class 'list'>

#实例化的到3个对象l1,l2,l3
>>> l1=list()
>>> l2=list()
>>> l3=list()

#三个对象都有绑定方法append,是相同的功能,但内存地址不同
>>> l1.append
<built-in method append of list object at 0x10b482b48>
>>> l2.append
<built-in method append of list object at 0x10b482b88>
>>> l3.append
<built-in method append of list object at 0x10b482bc8>

#操作绑定方法l1.append(3),就是在往l1添加3,绝对不会将3添加到l2或l3
>>> l1.append(3)
>>> l1
[3]
>>> l2
[]
>>> l3
[]
#调用类list.append(l3,111)等同于l3.append(111)
>>> list.append(l3,111) #l3.append(111)
>>> l3
[111] 
从代码级别看面向对象
# Author:lqx

#1、在没有学习类的这一概念,数据与功能是分离的
def connect(host,port,db,charset):
    conn=0
    pass
    return conn
def exc1(host,port,db,charset,sql):
    conn=connect(host,port,db,charset)
    return  conn.execcute(sql)

def exc2(host, port, db, charset,proc_name):
    conn = connect(host, port, db, charset)
    return   conn.call_proc(proc_name)
exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字')


#2、我们想到的解决办法是,把相同的变量都定义为全局变量
HOST=‘127.0.0.1’
PORT=3306
DB=‘db1’
CHARSET=‘utf8’
x=1
y=2

def exc1(sql):
    conn=connect(host,port,db,charset)
    conn.execute(sql)
    return xxx


def exc2(proc_name):
    conn=connect(host,port,db,charset)
    conn.call_proc(proc_name)
    return xxx

exc1(HOST,PORT,DB,CHARSET,'select * from tb1;')
exc2(HOST,PORT,DB,CHARSET,'存储过程的名字')


def func1():
    print(x)
    print(y)

def func2():
    print(x)
    print(y)
#每次调用都需要重复传入一堆参数
exc1('select * from tb1;')
exc2('utf8','存储过程的名字')

exc1('select * from tb2;')

func()




#使用类以后,定义一个类
class Mysqlhandle():
    def __init__(self,host,port,db,charset='utf-8'):
        self.host=host
        self.port=port
        self.db=db
        self.charset=charset
        self.conn=conntect(host,port,db,charset)

    def exc1(self,sql):
        return self.conn.execute(sql)
    def exc2(self,proc_name):
        return self.conn.call_proc(proc_name)
obj1=Mysqlhandle('127.0.0.1','3306','db1')
obj1.exc1('select * from db1')
obj1.exc1('select * from db2')

obj2=Mysqlhandle('10.10.10.9','3306','db2')
obj2.exc2('select * from t1 where id > 3')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值