Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

一、面向对象之多态

  1、多态:简而言子就是多种形态或多种类型

  python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型,

  java多态传参:必须是传参数的数据类型或传参的子类类型

  面向对象总结:

  面向对象是一种编程方式,此编程方式的实现是基于对象的使用

  类:是一个模板,模板中包含了多个函数共使用,即类中可包含多个函数(类中的函数即叫做方法)

一般疑问:

  1)什么样的代码才是面向对象?

  简单来说,如果程序中的所有功能否是由 “类”和“对象”实现,那么就是面向对象编程

  2)函数式编程和面向对象如果选择?分别在什么情况下使用?

  C#和java只支持面向对象编程,不支持函数式编程

  python和PHP则支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而对象能实现的操作,函数则不行(函数式编程无法实现面向对象的封装功能)

  python编程中,全部使用面向对象或面向对象和函数式混合使用

  1、多个函数使用共同的值:类中的函数俗称为一个方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:lcj
#Blog address(博客地址):http://i.cnblogs.com/EditPosts.aspx?postid=5500010&update=1
#学号:stu179501 password:055bc2457dfa2e

class hh:
	def __init__(self,host,user,pwd):
		self.host = host
		self.user = user
		self.pwd = pwd
	#增加
	def zengjia(self,sql):
		print(self.host)
		print(self.user)
		print(self.pwd)
		print(sql)
	#删除
	def shangchu(self,sql):
		print(sql)
	#修改
	def xiugai(self):
		print(self.host)
		print(self.user)
		print(self.pwd)
	#查
	def cha(self):
		pass
#将动态传输‘localhost‘,‘lcj‘,123传给__init__方法中host,user,pwd
obj1 = hh(‘localhost‘,‘lcj‘,123)
# obj1.zengjia(‘selet * from A‘)  #有对象调用方法时系统会自动执行__init方法并将动态参数selet * from A传递个sql
##输出
#localhost
# lcj
# 123
# selet * from A
# obj2 = hh(‘localhost‘,‘lcj‘,123)
# obj2.shangchu(‘select * from lcj‘)
# #修改,host,用户名,密码
obj3 = hh(‘127.0.0.1‘,‘xiaoluo‘,123)
obj3.xiugai()
# 127.0.0.1
# xiaoluo
# 123

  2、需要创建多个事务,每一个事务属性个数相同,但是值得需求如:姓名、年龄、血型都不相同,即属性个数相同,但是值不相同

class dome():
	def __init__(self,name,age,xuexing):
		self.name = name
		self.age = age
		self.xuexing = xuexing
	def tail(self):
		temp = "My nian%s age%s 血型%s"%(self.name,self.age,self.xuexing)  #指定站位符记性传参
		print(temp)
obj1 = dome(‘lcj‘,12,‘O‘)
obj1.tail()
# My nianlcj age12 血型O
obj2 = dome(‘xiaoluo‘,18,‘O‘)
obj2.tail()
# My nianxiaoluo age18 血型O

二、面向对象中类成员

  python类成员包含:字段、方法、属性

  1、字段

  普通字段:保存在对象中 ,存在于对象中,一般情况下由对象访问普通字段

  静态字段:属于类中,保存在内里面,即在类下面,由“类”访问静态字段

  注意:一般情况下,自己访问自己,静态字段中(在万不得已情况下可以用对象访问静态字段)

  静态字段在代码加载时已经创建,而对象则需要创建并调用才能将数据存放在内存

  由图可知:

  • 静态字段在内存中只保存一份
  • 普通字段在每一个对象中都要保存

  应用场景:通过类创建对象时,如果每一个对象中都包含相同的字段,那么就可使用静态字段(静态字段存在于类面)

class Province:
	#静态字段
	Country = ‘世界‘
	def __init__(self,name):
		#普通字段
		self.name = name
#一般情况下,自己访问自己
zh = Province(‘中国‘)
print(zh.name)  #对象访问普通字段
#静态字段:只有类才能访问,在万不得已下可以用对象访问静态字段
print(zh.Country)
#由类访问静态字段
print(Province.Country)

  2、方法

  python中什么是方法?

  定义:将函数放至类中,且传参中含有“slef”,表示方法

  方法:静态方法、普通方法及类方法三种方法在内存中都归属类,其他语言中只含有两种方法:静态方法和普通普通方法

  1)静态方法:

  静态方法:调用静态方法时,需再方法前加@staticmethod,参数即可有可无,一般由类执行静态方法(不到万不得已时,可用对象调用静态方法),静态方法中参数可有可无

class Province:
	#静态字段
	Country = ‘世界‘
	def __init__(self,name):
		#普通字段
		self.name = name
	#普通方法,与对象调用(方法属于类)
	def show(self):
		print(self.name)
	#静态方法:两步,去掉self,二,添加装饰器@staticmethod
	@staticmethod
	def f1(arg1,arg2):
		#静态方法由类调用,(当方法内部不需要对象中封装的值时,可以将方法写成静态方法)
		print(arg1,arg2)
# obj1 = Province(456,234)
# obj1.f1()   #由对象调用静态方法,则报错
#类调用静态方法
Province.f1(111,122)
# 111 122

  2)普通方法

  创建普通方法时参数中必须带一个self关键字,当任意对象执行普通方法时,自动将调用该方法的对象赋值给self

  3)类方法:

  创建规则:创建类方法时需在类方法前加@classmethod ,参数中必须带一个“cls”关键字,执行类方法时,自动将调用该方法的类赋值给cls关键字

  特点:由类调用类方法时,系统自动将当前类名传递给cls参数

class Province:
	#静态字段
	Country = ‘世界‘
	def __init__(self,name):
		#普通字段
		self.name = name
	#普通方法,与对象调用(方法属于类)
	def show(self):
		print(self.name)
	#静态方法:两步,去掉self,二,添加装饰器@staticmethod
	@staticmethod
	def f1(arg1,arg2):
		#静态方法由类调用,
		print(arg1,arg2)
	#类方法:由类调用,
	@classmethod
	# 类方法参数中至少有“cls"参数
	def f2(cls): #调用类方法时,系统自动将当前类名传递给cls
		print(cls)
#类调用静态方法
Province.f1(111,122)
# 111 122
Province.f2()
#<class ‘__main__.Province‘>

  3、属性

  定义:不伦不类的东西

  规则:在创建属性时,在普通方法基础上添加@property装饰器,属性仅有一个self参数,调用时无需加括号

按照对象调用方法进行访问形式且执行调用方法时不加“括号”,ret = obj.show 【obj属于对象,show属于对象中存在的方法】

  特点:具有方法的写作形式(),又有字段的访问形式(字段是用过对象访问,且访问时不加“括号”进行访问)

  Python的构造方法中有四个参数:

第一个参数是方法名,调用 对象.属性 时自动触发执行方法
第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
class Foo:

    def get_bar(self):
        return ‘lcj‘

    # *必须两个参数
    def set_bar(self, value):
        return ‘set value‘ + value

    def del_bar(self):
        return ‘qaz‘

    BAR = property(get_bar, set_bar, del_bar, ‘description...‘)

obj = Foo()

ret = obj.BAR              # 自动调用第一个参数中定义的方法:get_bar
print(ret)
ret= obj.BAR = "xiaoluo"     # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
print(ret)
del Foo.BAR          # 自动调用第三个参数中定义的方法:del_bar方法
# obj.BAE.__doc__      # 自动获取第四个参数中设置的值:description...

  通过方法完成分页:

#通过方法计算分页
class www:
	def __init__(self,all_count):
		self.all_count = all_count
	def show(self):
		#divmod:计算分页,a1表示商,a2:表示余数
		a1,a2 = divmod(self.all_count,10)
		if a2 == 0:
			return a1
		else:
			return a1 + 1
obj = www(101)  #创建obj1对象,并把101参数赋值给对象obj
ret = obj.show()  #由对象调用show方法,并将返回结果值赋值给一个变量
print(ret)
# 11

  通过添加属性@property,再由对象调用方法执行

class www:
	def __init__(self,all_count):
		#字段all_count
		self.all_count = all_count
	#属性
	@property
	def show(self):
		#divmod:计算分页,a1表示商,a2:表示余数
		a1,a2 = divmod(self.all_count,10)
		if a2 == 0:
			return a1
		else:
			return a1 + 1
obj = www(101)  #创建obj1对象,并把101参数赋值给对象obj
# ret = obj.all_count  #对象调用字段all_count
# print(ret)  101
# ret = obj.show()  #由对象调用show方法,并将返回结果值赋值给一个变量
# print(ret)
# 11
ret3 = obj.show  #通过对象调用方法,此时方法已经被属性化,无需加()即可执行show方法
print(ret3)
# 11

  对属性中的数值进行“修改(添加装饰器@show.setter)、删除(添加装饰器@show.deleter)”操作,show属于方法

class www:
	def __init__(self,all_count):
		#字段all_count
		self.all_count = all_count
	#属性
	@property
	def show(self):
		#divmod:计算分页,a1表示商,a2:表示余数
		a1,a2 = divmod(self.all_count,10)
		if a2 == 0:
			return a1
		else:
			return a1 + 1
	#修改属性中的数值
	@show.setter
	def show(self,value):
		print(value)
	#对属性中数值进行删除
	@show.deleter
	def show(self):
		print(‘del show‘)
obj = www(101)  #创建obj1对象,并把101参数赋值给对象obj
# ret = obj.all_count  #对象调用字段all_count
# print(ret)  101
# ret = obj.show()  #由对象调用show方法,并将返回结果值赋值给一个变量
# print(ret)
# 11
# print(obj.all_count)
# obj.all_count = 102  #对字段进行重新赋值
# print(obj.all_count)
# del obj.all_count  #删除字段中的数字
ret = obj.show
print(ret)
#修改属性中的数值
obj.show = 123
#删除属性中值
del obj.show

  方式二:foo = property(F1,F2,F3)

class lcj:
	def __init__(self,count):
		self.count = count
		pass
	def F1(self):
		return 111
	def F2(self,value):
		pass
	def F3(self):
		print(‘hahaha‘)
	#当对象调用foo方法时,系统会自动执行指定的方法
	foo = property(F1,F2,F3)
obj = lcj(124)
#打印原属性中的值
ret = obj.foo
print(ret)  # 返回值:111
#修改属性值
ret = obj.foo = 1000
print(ret)   #返回修改属性值为:1000
del obj.foo  #返回删除属性中的值:hahaha

三、成员修饰符

时间: 2024-10-01 20:24:18

Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇的相关文章

python入门第二十四天----成员修饰符 类的特殊成员

1 #成员修饰符 修饰符可以规定内部的字段.属性.方法等 是共有的成员,私有的成员 2 class Foo: 3 def __init__(self,name,age): 4 self.name=name 5 self.age=age #可以在外部直接访问 6 7 obj=Foo('Jack',22) 8 print(obj.name) 9 print(obj.age) 共有字段 1 #成员修饰符 修饰符可以规定内部的字段.属性.方法等 是共有的成员,私有的成员 2 class Foo: 3 d

面向对象之成员修饰符

一.成员修饰符 1.方法名带下划线例  __name() 即属性私有化,就表明该函数不可以通过对象或者类调用(简称外部调用),只能通过类的内部其他方法间接的调用. 2.类中的静态字段.普通字段.静态方法.普通方法.类方法,都适用. 3.儿子孙子继承者也不能访问. class Foo: __xo = "xo" def __init__(self,name,age): __dog = "cat" self.n = name self.a = age def f1(sel

面向对象中的特殊的成员修饰符和几个特殊的方法

面向对象的成员修饰符 #Auther Bob #--*--conding:utf-8 --*-- # 成员修饰符 # 共有成员 # 私有成员 # 1.私有字段 # 私有的普通字段 # 私有的静态字段 # 2.私有方法 # 私有的方法 # 默认情况下,类的字段和方法都是共有的,通过对象和类就直接可以访问,但是如果我们在字段或者方法名字的前面加2个下划线,那么我们就不能在外部访问这些字段和方法,这些 # 方法和字段只能内部方法 class person(object): name = "diandi

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)

一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,那在python中,我们该怎么做能够少写代码,又能优雅的实现想要的限制,减少错误的发生呢,这时候就需要我们的@property. 获取特性 class Foo: def __init__(self,name): self.name = name #

python学习笔记-Day8 上(pickle补充、字段、面向对象成员、成员修饰符、特殊方法)

pickle 序列化补充 # pickle load # 现在有两个python程序,调用关系如下 # s1.py class foo: …. Obj = foo(x,y) Pickle.dump(obj, open(‘db’,’wb’)) S2.py # s2.py from s1 import foo pickle.load(db) # s2.py 反序列化加载包含对象,一定要先导入对象对应的类,否则Pickle load将会报错 类多继承关系 有共同父类的继承关系如下 如图,如果我们有两个

Python类成员及类成员修饰符

13.面向对象:多态.继承.封装成员:字段:普通字段.静态字段方法:普通方法.静态方法.类方法特性:property,将方法伪造为字段,可以直接使用类.方法名调用,不用加() 成员修饰符:公有和私有,私有的字段和方法可以通过对象中的其他普通方法间接进行调用私有字段:__field, 以__双下划线开头的字段,私有字段只能在自己的对象中才能使用,继承后也无法使用私有方法:__function, 以__双下划线开头的方法,私有字段只能在自己的对象中才能使用,继

学习C#修饰符:类修饰符和成员修饰符

C#修饰符之类修饰符:public.internal. partial.abstract.sealed.static C#修饰符之成员修饰符:public.protected.private.internal.sealed.abstract.virtual.override.readonly.const Public:最开放,所有的本程序集以及其他的程序集里面的对象都能够访问 Protected:比较开放,自身成员以及子类成员可访问 Private:只有自身成员才能够访问 Internal:本程

Python学习 :面向对象 -- 成员修饰符

成员修饰符 两种成员 - 公有成员 - 私有成员, __字段名 - 无法直接访问,只能通过内部方法来间接访问私有成员 简例:公有成员与私有成员  class Info: country = '中国' # 静态字段 __gender = '男' # 静态字段私有化 def __init__(self,name,age): self.name = name self.__age = age # age字段为私有的,外部无法直接访问 def show(self): return self.__age,