python学习笔记(十九)-- 面向对象

类:
一个种类,一个模版,一个图纸。
对象(也叫实例):
根据类(模版)造出来的具体的东西。
实例化:
把类变成对象的过程
构造函数:
在这个类初始化(实例化)的时候执行的
析构函数:
在这个实例被销毁的时候自动执行
self:
本类对象,self就是实例,就是对象
继承
就是继承父类有的功能,可以直接使用父类功能
类变量
直接在类里面定义的变量就是类变量,实例也可以使用
实例变量
self.xxx 这种都是实例变量,不实例化不能使用
类方法
不需要实例化就能调用的方法,可以使用类变量,但不能调用类里面的方法
用@classmethod装饰
什么时候使用:如果这个方法是和类相关,但不需要使用实例变量,那就应该把这个方法定义成类方法
静态方法
和这个类没关系,不能调用类方法,不能使用类变量
只是定义在这个类里面的一个普通的方法。
如果这个方法,不需要使用类方法、类变量、实例方法、实例变量
属性方法
看起来像变量的一个方法
封装
多个功能写到一个类里
私有
只能在类里面调用的方法或者变量,类外面不能调用
# class Person(object):#新式类定义,新的写法,效果一样
#类名习惯大写
class Person:#经典类定义
    country = '中国'#类变量,公用的,存在类里,不存在实例里
    def __init__(self,mouth,eyes,name):#构造函数,实例化时会自动调用执行
        print('self的内存地址: ', id(self))
        self.mouth = mouth #实例变量
        self.eyes = eyes
        self.name = name
    def fly(self):
        print('【%s】会飞'%self.name)
    def eat(self):
        print('【%s】会吃'%self.name)
    def say(self):
        print('【%s】,【%s】张嘴,【%s】只眼睛'%(self.name,self.mouth,self.eyes))
        print('%s的国际是%s'%(self.name,self.country))
    def smile(self):
        print('【%s】会笑'%self.name)

nn = Person(1,2,'nana')#实例化,必须带上参数
print('nn的内存地址: ',id(nn))
#self的内存地址与对象的内存地址一样,self就是对象本身

nn.smile()#调用方法
nn.fly()
nn.eat()
nn.say()

#函数传入一个实例
def my_def(self):
    print(self.name)
    self.fly()
my_def(nn)

构造函数和析构函数

class Car:
    def __init__(self,color,wheel=4):#构造函数,实例被创建的时候执行
        self.color = color
        self.wheel = wheel
        print('实例被创建的时候会自动执行我')
    def __del__(self):#析构函数,实例被销毁的时候执行
        print('实例被销毁的时候会自动执行我')
    def run(self):
        print('汽车在跑')
    def fly(self):
        print('fly')
        self.action = 'fly'# 定义在函数里的变量,需要调用完函数才会生成
    def swim(self):
        self.action = 'swim'
    def about(self):
        print('%s %s'%(self.color,self.wheel))
        print('汽车现在的功能是 %s'%self.action) #调用完fly、swim函数后才能action的属性
    def calc(self,a,b):
        print(a+b)

bmw = Car('red')
bmw.run()
bmw.fly()
bmw.swim()
bmw.about()

bmw.calc(1,2)

面向对象实例:连接操作mysql的类

class MyDb:
    # def __init__(self, ip, user, password, db, port=3306, charset='utf8', autocommit=True):
    def __init__(self,**info):
        try:
            self.conn = pymysql.connect(**info)
            # self.conn = pymysql.connect(host=ip,user=user,password=password,db=db,port=port,charset=charset,autocommit=autocommit)
            self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
        except Exception as e :
            print('数据库连接失败!')
            raise Exception('数据库连接失败!%s'%e)

    def __del__(self):
        print('--del--')
        self.cursor.close()
        self.conn.close()

    def execute_one(self,sql):
        result = '执行成功'
        if sql.strip().lower().startswith('select'):
            try:
                self.cursor.execute(sql)
            except Exception as e :
                print('sql语句出错!%s'%e)
            else:
                result = self.cursor.fetchone()
        return result

    def execute_many(self,sql):
        result = '执行成功'
        if sql.strip().lower().startswith('select'):
            try:
                self.cursor.execute(sql)
            except Exception as e :
                print('sql语句出错!%s'%e)
            else:
                result = self.cursor.fetchall()
        return result

    def table_exists(self,table_name):
        sql = "SELECT table_name FROM information_schema.TABLES WHERE table_name ='%s';" % table_name
        if self.execute_one(sql):
            return True

my_sql = MyDb(**setting.mysql_info)
res2 = my_sql.table_exists('app_myuser')
print(res2)
res = my_sql.execute_one('select * from app_myuser')
#res = my_sql.execute_one("insert into qq_mem_dongxl(qq,nick,join_time,gender,card) values('1111','aaaa','2019-4-10','女','茶叶');")
print(res)

类变量、类方法、实例变量、属性方法

class Car:
    wheel = 4 #类变量,存在类里面
    window = 4

    def say(self):
        print('有%s个轮子'%self.wheel)
        self.interview()

    def set_wheel(self,wheel,window):
        Car.wheel = wheel #修改类的变量
        self.window = window #给实例加了一个变量,实例变量

    @classmethod#类方法,不需要实例化就能使用
    def interview(cls):
        print('这个车有%s个轮子'%cls.wheel)

    #属性方法,使用时像变量一样,必需有返回值
    @property
    def name(self):
        return 'xiaobai'

print(Car.wheel)#4类变量可以不实例化,直接使用
Car.interview()#类方法,可以不实例化,直接调用
b = Car()
print(b.name)#属性方法,直接当变量使用
b.set_wheel(3,2)
print(b.wheel)#3
print(b.window)#2

 私有变量、私有函数

import redis
class MyRedis:
    name = 'haha'
    def __init__(self,ip,password,port=6379):
        self.__ip = ip#私有变量,只能在类里面使用
        self.__port = port
        self.__password = password
        self.conn_redis()
    def conn_redis(self):
        self.r = redis.Redis(host=self.__ip,password=self.__password,port=self.__port)
    def get_str(self,key):
        return self.r.get(key)
    def say(self):
        print('ip',self.__ip)
        self.__dd()
    # 私有方法,只能在类里面使用,实例化不能使用
    def __dd(self):
        print('dd')


r = MyRedis('118,24,3,40','HK139bc&*')
print(r.__ip)#不能这样使用,私有变量只能在类里被使用
r.__dd()#不能这样使用,私有方法只能在类里被调用
r.say()

继承

class Lw:
    country = 'china'
    money = 100000

    def driver(self):
        print('开车')

    def makeMoney(self):
        print('zhengqian')

#继承
class Xw(Lw):
   print(Lw.money)#使用父类变量
  def makeM(self):
  super().makeMoney()#用super()使用父类方法
def driver(self): #重写父类方法
        print('自己开车')

xw = Xw()
xw.driver()#调用自己的函数
print(xw.money)
xw.makeMoney()#调用父类函数


class DbBase:
    def __init__(self,ip,port,password,db):
        self.ip = ip
        self.port = port
        self.password = password
        self.db = db

class MySQL(DbBase,Lw):#继续多个父类
    #重写父类方法
     #1、父类的方法一点都不用
     #2、在父类的方法基础上做扩展
    #super() 找到父类
    def __init__(self,ip,port,password,db,user):
        super().__init__(ip,port,password,db)#用super()找到父类,再调用父类的构造方法(或者其它方法)
        self.user = user
m = MySQL('11.11.11.11','3306','password','db','nana')
m.driver()
print(m.ip)
print(m.user)

 



posted @ 2019-05-27 17:06  颜颜blog  阅读(243)  评论(0编辑  收藏  举报