day8-Python学习笔记(十八)面向对象,self,私有,属性方法

面向对象编程:把以前你写的那些函数封装到一个类里面

类:定义类的时候,类名的首字母都大写,用类的话,必须得先实例化

构造函数:类被实例化的时候,它会自动的执行构造函数。

属性:类里面的变量
方法:类里面的函数。

self代表的是本类对象。

实例就是对象,实例变量和类变量

私有函数  __redis()
私有变量 __host
只能在类里面使用,出了类就不能用了。

继承
父类有的功能、变量子类全有。
如果定义的类,有很多重复功能的,那就可以把这些重复的类,定义成父类
封装

多态 python不支持多态
一种方法多种实现。

实例方法,必须得实例化后才可以调用
属性方法 你看上去好像是一个属性,其实是一个函数,也得实例化才能调用

类方法
不需要实例化就能直接用的,它可以使用类变量和类方法。
#类方法,也不需要实例化,直接就能用。它静态方法高级一点
#它可以使用类变量和类方法。

静态方法
不需要实例化就能直接用的,其实和类没有什么关系,就是一个普通的函数
写在了类里面而已,也用不了self的那些东西,也调用不类里面的其他函数。
修改父类的构造函数

class Car():#模型,模板
def __del__(self):
#析构函数,这个实例被销毁的执行的。
print('over..')

def my_self(self):
print(
'我是一个汽车 我的颜色是【%s】,我有【%s】个窗户'%(self.color,self.window)
)
self.price = 10002
def run(self):
print(self.color)
print(self.window)
print(self.price)
print('汽车在跑。。。')

def __init__(self,color,window):
#
#构造函数,是类在初始化的时候会执行它
#如果你的类在实例化的时候要传入一些参数,那么你就要在__init__这个函数里写参数了
self.color = color #绑定属性
self.window = window
print('执行我了。。')

#把模型做成实际的一个汽车,这个过程叫做实例化。
bus = Car('黄色','3开门') #实例化
bus2 = Car('黑色','4开门') #实例化
bus3 = Car('粉色','2开门') #实例化
bus.my_self() #
bus2.my_self()
bus3.my_self()

#实例就是指具体造出来的东西,通过类实例化处理的东西,就是实例
#对象,就是实例

操作数据库(封装一个mysql的类)

import pymysql
class OpMySql1: #经典类
pass

class OpMySql(object):#新式类
def __init__(self,host,user,password,db,port=3306,charset='utf8'):
schema = {
'user':user,
'host':host,
'password':password,
'db':db,
'port':port,
'charset':charset
}
try:
self.coon = pymysql.connect(**schema)
except Exception as e:
print('数据库连接异常!%s'%e)
quit('数据库连接异常!%s'%e)
else:#没有出异常的情况下,建立游标
self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)

def execute(self,sql):
try:
self.cur.execute(sql)
except Exception as e:
print('sql有错误%s'%e)
return e
if sql[:6].upper()=='SELECT':
return self.cur.fetchall()
else:#其他sql语句的话
self.coon.commit()
return 'ok'

def __del__(self):
self.cur.close()
self.coon.close()

ybq = OpMySql('211.149.218.16','jxz','123456',db='jxz') #实例化

print(ybq.execute('select * from stu;'))
print(ybq.execute('select * from stu;'))
print(ybq.execute('select * from stu;'))

self总结
class My():
def __init__(self,name):
self.name = name
self.cry()
def cry(self): #实例方法,必须得实例化后才可以调用
print('%s在哭。。。'%self.name)
def learn(self):
self.skill = ['开车']
def my_self(self):
print('我的名字【%s】 我会%s'%(self.name,self.skill))

wsl = My('王思磊') # self = wsl
wsl.skill = '浪'
wsl.learn()
wsl.skill.append('浪')
wsl.skill.append('骚')
wsl.skill.append('贱')
wsl.my_self()
wsl.learn()
wsl.my_self()


实例变量
class Person(object):
country = 'China' #类变量
def __init__(self,name,age,sex):
self.name = name #实例变量,必须实例化之后才能用,成员变量
self.age = age
self.sex = sex

def say_my_country(self):
print(self.country)

#print(Person.country)

# dsx = Person('大师兄',23,'男')
# print(dsx.name)
# print(dsx.age)
# print(dsx.sex)
# print(dsx.country)
# ybq = Person('原宝青',28,'男')
 
# 签名,作用为了作弊
# 82B20DE4-40C2-4859-9DBC-C93B0FBFD09C
#sign
#1、先去用户的设备号码,md5 加密一次
#2、再取加密之后前10位
#3、再加盐,再给他md5一次
#4、最后生成一个字符串

from hashlib import md5

class GetSign(object):
slat = 'SDF234_&#$_12'
def __init__(self,device_id):
self.device_id = device_id
def md5(self,str):
#md5加密的
s = str.encode()
m = md5(s)
return m.hexdigest()

@property #把这个函数变成一个属性方法 ,如果这个方法没有入参,那就可以给变成一个属性方法
def get_res(self):
first_md5 = self.md5(self.device_id)
tmp = first_md5[:10] #取前10位
after_salt = tmp+self.slat
self.sign = self.md5(after_salt)
return self.sign

res = GetSign('82B20DE4-40C2-4859-9DBC-C93B0FBFD09C')
print(res.device_id)
print(res.get_res)

 
import redis
class MyRedis():
xiaohei = '哈哈哈'
def __init__(self,host,password='',port=6379):
self.__host = host
self.passwd = password
self.port = port
self.__coon_redis()
def __coon_redis(self):
self.coon = redis.Redis(host=self.__host,password=self.passwd,port=self.port)
def get(self,k):
print('__host...',self.__host)
return self.coon.get(k).decode()

@staticmethod #静态方法
def other():
print('我是other')
@classmethod#类方法,也不需要实例化,直接就能用。它静态方法高级一点
#它可以使用类变量和类方法。
def class_fun(cls):
print(cls.xiaohei)
cls.class_fun2()
@classmethod
def class_fun2(cls):
print('我是类方法2')
# r = MyRedis('211.149.218.16','123456')
MyRedis.class_fun()











原文地址:https://www.cnblogs.com/flynn0825/p/8439899.html