Python:函数式+面向对象
函数式可以做所有的事,是否合适
定义:
函数:def+函数名(参数)
面向对象:class
def (函数在class里面叫方法,类里面写方法,第一个参数必须是self)
执行
函数:函数名(参数)
面向对象:先创建中间人(对象,实例),然后通过中间人去访问方法
定义类并执行类中的方法:
class 类名:
def 方法名(self,arg):
print(arg)
中间人=类名()
中间人.方法名()
class var:
def foo(self,arg):
print(arg)
return 4
boo=var()
ret=boo.foo(111)
print(ret)
self代指调用方法的对象,类和对象的关联为类对象指针
构造方法:
特殊作用:
在obj=类名()
创建对象
通过对象执行类中的一个特殊方法
类名()自动执行构造方法
=====================================================================
1、如何创建类
class 类名:
pass
2、创建方法
构造方法,__init__(self,arg)
obj = 类('a1')
普通方法
obj = 类(‘xxx’)
obj.普通方法名()
3、面向对象三大特性之一:封装
class Bar:
def __init__(self, n,a):
self.name = n
self.age = a
self.xue = 'o'
b1 = Bar('alex', 123)
b2 = Bar('eric', 456)
4、适用场景:
如果多个函数中有一些相同参数时,转换成面向对象
class DataBaseHelper:
def __init__(self, ip, port, username, pwd):
self.ip = ip
self.port = port
self.username = username
self.pwd = pwd
def add(self,content):
# 利用self中封装的用户名、密码等 链接数据
print('content')
# 关闭数据链接
def delete(self,content):
# 利用self中封装的用户名、密码等 链接数据
print('content')
# 关闭数据链接
def update(self,content):
# 利用self中封装的用户名、密码等 链接数据
print('content')
# 关闭数据链接
def get(self,content):
# 利用self中封装的用户名、密码等 链接数据
print('content')
# 关闭数据链接
s1 = DataBaseHelper('1.1.1.1',3306, 'alex', 'sb')
5、面向对象三大特性之二:继承
1、继承
class 父类:
pass
class 子类(父类):
pass
2、重写
防止执行父类中的方法
3、self永远是执行该方法的调用者
4、
super(子类, self).父类中的方法(...)
父类名.父类中的方法(self,...)
5、Python中支持多继承
a. 左侧优先
b. 一条道走到黑
c. 同一个根时,根最后执行
6、面向对象三大特性之三:多态
====> 原生多态
# Java
string v = 'alex'
def func(string arg):
print(arg)
func('alex')
func(123)
# Python
v = 'alex'
def func(arg):
print(arg)
func(1)
func('alex')
==================================================================
练习:
class Person:
def __init__(self,n,a,g,f):
self.name = n
self.age =a
self.gender =g
self.fight = f
role_list = []
y_n = input('是否创建角色?')
if y_n == 'y':
name = input('请输入名称:')
age = input('请输入名称:')
...
role_list.append(Person(....))
# role_list,1,2
========================== 面向对象中高级=================================
class Foo:
def __init__(self, name):
# 普通字段
self.name = name
# 普通方法
def show(self):
print(self.name)
obj = Foo('alex')
obj.name
obj.show()
类成员:
# 字段
- 普通字段,保存在对象中,执行只能通过对象访问
- 静态字段,保存在类中, 执行 可以通过对象访问 也可以通过类访问
# 方法
- 普通方法,保存在类中,由对象来调用,self=》对象
- 静态方法,保存在类中,由类直接调用
- 类方法,保存在类中,由类直接调用,cls=》当前类
# 应用场景:
如果对象中需要保存一些值,执行某功能时,需要使用对象中的值 -> 普通方法
不需要任何对象中的值,静态方法
# 属性(特性)
- 不伦不类
中国的所有省份,用面向对象知识表示?
class Province:
# 静态字段,属于类
country = '中国'
def __init__(self, name):
# 普通字段,属于对象
self.name = name
henan = Province('河南')
henan.name
henan.name = "河南南"
#hebei = Province('河北')
# Province.country
======================================================================================================================
#__author__:"lili"
#date:2018/3/19 (面向对象)
class var:
def foo(self,arg):
print(arg)
return 4
boo=var()
ret=boo.foo(111)
print(ret)
class bar:
def foo(self,name,age,gender,content):
print(self,name,age,gender,content)
obj=bar()
obj.foo('小明','23','男','开车去东北')
#============================================
class bar:
def foo(self,arg):
print(self,self.name,arg)
obj=bar()
obj.name='bh'
obj.foo(56)
class bar:
def foo(self,name,age,gender,content):
print(self,self.name,self.age,self.gender,content)
def foo(self, name, age, gender, content):
print(self, self.name, self.age, self.gender, content)
def foo(self, name, age, gender, content):
print(self, self.name, self.age, self.gender, content)
obj=bar()
# obj.foo('小明','23','男','开车去东北')
# obj.foo('小明','23','男','听音乐')
obj.name='小明'
obj.age=12
obj.gender='男'
# obj.add('上山去砍柴')
# obj.delete('开车去东北')
# obj.update('开车去东北')
# 构造方法:__init__
# 特殊作用:
# 在obj=类名()
# 创建对象
# 通过对象执行类中的一个特殊方法
class bar:
def __init__(self,name,age):
# print('sb')
self.n=name
self.a=age
def foo(self):
print('jg')
obj=bar('alex',12)
print(obj.n,obj.a)
class person:
def __init__(self,name,age):
self.n=name
self.a=age
def show(self):
print('%s--%s'%(self.n,self.a))
p1=person('alex',11)
p2=person('alice',22)
p1.show()
p2.show()
class bar:
def __init__(self,name,age,gender):
self.n=name
self.a=age
self.g=gender
def add(self,content):
print(self,self.n,self.a,self.g,content)
def delete(self, content):
print(self, self.n, self.a, self.g, content)
def update(self,content):
print(self, self.n, self.a, self.g, content)
def get(self, content):
print(self, self.n, self.a, self.g, content)
obj=bar('小明',11,'男')
obj.add('上山去砍柴')
obj.delete('开车去东北')
obj.update('最爱胡萝卜')
class person:
def __init__(self,name,age):
self.n=name
self.a=age
#默认值直接写在这里
self.x='o'
def show(self):
print(self,self.n,self.a,self.x)
p1=person('xiao',11)
p1.show()
#==========================继承===================================
class grandFather():
def heshui(self):
pass
class Father(grandFather): #父类(基类)
def lanqiu(self):
pass
def zuqiu(self):
pass
def xiyan(self):
pass
def hejiu(self):
pass
def tangtou(self):
pass
class Son(Father): #子类(派生类)
def baojian(self):
pass
s=Son()
s.baojian()
s.hejiu()
s.heshui()
# 在子类中定义和父类一样的方法名就执行子类的方法
class F:
def f1(self):
print('F.f1')
def f2(self):
print('F.f2')
class S(F):
def s1(self):
print('S.s1')
def f1(self):
# 执行父类的方法有两种方式
super(S,self).f1()
F.f1(self)
print('S.f1')
obj=S()
obj.s1() #s1中的self是形参,此时代指obj
obj.f1() #self永远指调用方法的调用者
#python 中支持一个子类继承多个父类,按照从左到右的顺序依次寻找直到找到
#如果两个父类有共同的父类则先找左侧的父类,先不找共同的父类,而是找右边的父类,最后找共同的父类
#================================================================
#练习 ,用的最多的是继承
class Person:
def __init__(self,n,a,g,f):
self.name=n
self.age=a
self.gender=g
self.fight=f
role_list=[]
y_n=input('是否创建角色?')
if y_n=='y':
name=input('请输入名称:')
age=input('请输入名称:')
#面向对象中高级
class Foo:
def __init__(self,namee):
#普通字段
self.name=name
#普通方法
def show(self):
print(self.name)
obj=Foo('alex')
obj.name
obj.show()
#类成员:包括普通字段(保存在对象中),普通方法(保存在类中),执行的时候字段不加括号,方法加括号
#静态字段保存在类中,执行时可以通过对象访问,也可以通过类访问
#中国的所有省份,用面向对象知识表示?
#创建一个省份的类
class Province:
#静态字段
country='中国'
def __init__(self,name):
self.name=name
#有多少省就会有多少个中国,如果保存在类中,每个省用指针指向该值
#类中的字段叫做静态字段,静态字段保存在类中,普通字段保存在对象中,只能通过对象访问
#self.country='中国'
# henan=Province('河南')
# hebei=Province('河北')
print(Province.country)
#__author__:"lili"
#date:2018/3/24
class Province:
#静态字段
country='中国'
def __init__(self,name):
self.name=name
# henan=Province('河南')
# hebei=Province('河北')
print(Province.country)
#方法有三种,方法的调用要么通过创建对象执行方法,或直接通过类执行方法,首先需创建对象
#普通方法保存在类中,由对象调用
#静态方法,保存在类中,由类直接调用
#类方法,是静态方法的变种,通过类可以直接调用
class Foo:
def bar(self): #self是对象
print('bar')
@staticmethod #加上装饰器,就是静态方法,静态方法self不是必须的
def sta():
print('123')
@staticmethod
def stat(a1,a2):
print(a1,a2)
@classmethod #类方法至少有一个参数
def classmd(cls): #cls是类名,不依赖于对象
print(cls)
print('classmd')
Foo.sta()
Foo.stat(1,2)
Foo.classmd()
print('====================================================================')
class Foo:
def bar(self):
print('bar')
#通过类对象指针找到方法
obj=Foo()
obj.bar()
#通过类直接找到方法,但是里面需传参数
obj=Foo()
Foo.bar(obj)
class Foo:
def __init__(self):
self.name='a'
#obj.name
#obj.bar()
def bar(self):
#self是对象
print('bar')
@property #属性(定义时像方法,访问时像字段)
# 用于执行obj.per,用于获取值
def per(self):
# print('123')
return 1
@per.setter #设置字段,给字段赋值,用于执行obj.per=123
def per(self,val):
print(val)
@per.deleter #删除某个字段时在前面加上关键字del
def per(self):
print(555)
obj=Foo()
r=obj.per #@property
print(r)
obj.per=456 #@per.setter
del obj.per #@per.deleter
#按照自己调用的方式不同,执行不同的对应的方法
print('========================================')
# li=[]
# for i in range(1000):
# li.append(i)
# while True:
# p=input("请输入要查看的页码:")
# p=int(p)
# start=(p-1)*10
# end=p*10
# print(li[start:end])
print('==========================================')
#封装成函数,用属性之后在调用时不用加括号。
# class pagenation:
# def __init__(self,current_page):
# try:
# p=int(current_page)
# except Exception as e:
# p=1
# self.page=p
# @property
# def start(self):
# val=(self.page-1)*10
# return val
# @property
# def end(self):
# val=self.page*10
# return val
#
# li=[]
# for i in range(1000):
# li.append(i)
# while True:
# p=input("请输入要查看的页码:")
# obj=pagenation(p)
# print(li[obj.start:obj.end])
class foo:
def f1(self):
return 123
def f2(self,v):
print(v)
def f3(self):
print('del')
per=property(fget=f1,fset=f2,fdel=f3,doc='tuvctc7tcc')
#和下面的功能一样
# @property
# def per(self):
# return 123
obj=foo()
ret=obj.per
print(ret)
obj.per=8989
del obj.per