Python类(一):总结复习

面向对象

“面向对象的方法主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想。总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象,(万物皆对象)------百度

面向过程可能是这样的:
               1)洗手
               2)拿碗筷
               3)端菜
               4)装饭
               5)吃饭
               6)夹菜
               7)判断是否夹菜(如果是则回到第6步)
               8)判断是否加法(如果是则回到第5步)
               9)擦嘴
               10)收拾
               11)打理卫生
(都是随着步骤一步步来进行执行的)

  但我们如果仔细观察会发现其实它们都有一定的共性,那我们何不把它们相同的一个共性放在一个块中内呢?
               1)饭前的准备
               2)吃饭
               3)饭后的收拾
这就是面向对象的美丽吧!

面向过程和面向对象的优缺点

面向过程
优点:性能上是优于面向对象的,因为在调用时的开销大
缺点:不易维护(比较繁琐吧)、复用、扩展

面向对象
优点:易维护、易复用、有一定的特性(封装、继承和多态)更加灵活,便于维护
缺点:性能相当于面向过程低

类和对象

  比如我们人类就是一个大的类,对象:小明就是人类的一个对象,对象之中有自己的方法,比如小明擅长打游戏啊等等…
成员变量和成员方法:成员变量就是人固有的属性,能直立行走啊!高智商啊等等…
成员方法:就是描述事物的行为,会聊天啊等等

举例

import inspect#看后面
class Human_beings(object):#类名一般为大驼峰法来进行书写
	#object是默认继承的父类
	def __init__(self,name,age):#__init__为初始化(后面我会相应的介绍的)
		self.name = name #属性赋值 实例化
		self.age = age #实例化年龄
	def title(self,title_name):#定义方法
		self.title_name = title_name
		print('{}他的称号是:{}'.format(self.name,self.title_name)

#创建对象
zhangsan = Human_beings('张三',22)
'''
self为方法中必不可少的,而张三就传入到了初始化的init的
形参name中,而22则传入到age中
一旦我们创建了对象就等于开辟了一块内存空间指向我们的类
Human_beings中
'''
zhangsan.title('法外狂徒')
'''
执行结果为:张三他的称号是:法外狂徒
所以我们也可以调用里面的方法 title
'''

print(zhangsan)#张三是指向Human_beings的,并自己开辟了一个空间
#对于我们怎么知道类继承的父类是object

#查找搜索顺序(1)
print(Human_beings.__mro__)#__mro__查看搜索顺序
'''
执行结果:
(<class '__main__.Human_beings'>, <class 'object'>)
不难看出,类先是找自己的,然后去找父类
就是你给别人欺负了,先去找爸爸
'''

#查看搜索顺序(2)需导入inspect库
print(inspect.getmro(Human_beings))
#和上面的方法一是一致的

放慢我们的脚步
定义成员变量:(描述固有属性)

#不要问我为什么要用代码片 因为打&nbsp;太累了,不知道怎么写空格
格式一:(无参)
	class 类名:
		def __init__(self):
			self.name = '王五'
			self.age = 44

	a = 类名()
	print(a.name)#打印name值
	print(a.age)

格式二:有参
	class 类名:
		def __init__(self,name,age):
			self.name = name
			self.age = age
	a = 类名('赵六',23)#传入初始化的形参
	#形参想象成*args,**kwargs
	print(a.name)
	print(a.age)	
	#需要注意的是在__init__中都是公有的属性哟!(大家的固有属性)
	#私有属性,在后面

成员方法:(一个人的固有属性)比如:张三(hhh)

格式一:无参(我们定义的方法没有参数)
	class work():
		def __init__(self,name,age):
			self.name = name
			self.age = age
		def eat(self)print('{}在吃饭'.format(self.name))
	a = work('李四',9)
	a.eat()

格式二:有参
	class work():
		def __init__(self,name,age):
			self.name = name
			self.age = age
		def eat(self,food):
			print('{}在吃{}'.format(self.name,food))
	a = work('张三',8,)
	a.eat('麻辣烫')#调用有参需传值

 																																					

__init__方法(魔术方法)

作用:构造方法,对象初始化

class Person:
	def __init__(self):
		print('---------->init')#只要调用则系统底层自动执行
study = Person()

需要我们知道的是:__私有化

还有就是__init__(slef)第一个参必须为self(init又俗称构造器)用于对象生命周期的初始化

大家可能要问,俺就不想用初始化
可以看看代码上不初始化和初始化的区别再说吧

'''
案例:我们需要在一个类中定义两个方法分别为eat和run
必须要有对应的姓名
'''
不初始化  
class Hello(object):
	def eat(self,name,food):
		self.name = name
		self.food = food
		print('{}喜欢吃{}'.format(self.name,self.food))
	def run(self,name):
		self.name = name
		print('{}在跑步'.format(self.name))
#如果我们两个一起调用,run确实不用多一个name,但是不能一边吃饭,一边跑步啊
a = Hello()
a.eat('赵六','红烧狮子头')
a.run('赵六')

初始化
class Hello(object):
	def __init__(self,name):
		slef.name = name
	def eat(self,food):
		self.food = food
		print('{}喜欢吃{}'.format(self.name,self.food))
	def run(self):
		print('{}在跑步'.format(self.name))
a = Hello('赵六')
a.eat('红烧狮子头')
a.run()
#别看现在差不多,要是有很多个方法呢 所以初始化很重要
	

	

__init__就是魔术方法中的一种,它是在类中声明的方法,是不需要进行调用的,系统自动调用(__new__的——》__init__的顺序)

__init__方法也可以这么用:

class Person:
    def __init__(self,name):
        self.name = name
        print('{}每天必做的事(养成习惯了)'.format(self.name))
        self.give_the_thumbs_up()#点赞
        self.Collection()#收藏
        self.forward()
        self.The_end()
    def give_the_thumbs_up(self):
        print('求点赞啊!不会写博客,空格写的我晕(用&nbsp;写的)大哥们')
    def Collection(self):
        print('收藏和转发都不勉强')
    def forward(self):
        print('收藏和转发都不勉强')
    def The_end(self):
        print('谢谢大家了')
a = Person('a')                        

__str__魔术方法

返回值回到变量中,返回类型为字符串类型

第一种类型正确
class Hey(object):
    def __init__(self,name,age,height,hobby):
        self.name = name
        self.age = age
        self.height = height
        self.hobby = hobby
    def __str__(self):
        return '姓名:{} 年龄:{} 身高:{} 爱好:{}'.format(self.name,self.age,self.height,self.hobby)
a = Hey('王五',20,190,'打篮球')
print(a)

类型错误
class Hey(object):
    def __init__(self,name,age,height,hobby):
        self.name = name
        self.age = age
        self.height = height
        self.hobby = hobby
    def __str__(self):
        return 1
a = Hey('王五',20,190,'打篮球')
print(a)
#报错原因:TypeError: __str__ returned non-string (type int) 
#返回值必须为字符串类型

私有化

   封装操作可以对受访问保护的成员进行功能开放的控制,达到保护数据不被非法访问的目的

废话不多说,直接看代码

最近呢,张三十分苦恼,走到哪里都有人说:"看!那不是法外狂徒!吗?
原来啊!自己的信息给别人填错了,明明是良好公民(滑稽)却被填成了法外狂徒!于是张三开始了修改之路
class Person():
    def __init__(self,age):
        self.age = age
        self.__name = '张三'
        self.__title = '法外狂徒'
zhangsan = Person(20)#张三发现修改后的信息只能修改年龄
#连查看自己称号都不行了,说是没有这个属性啊
#张三就问了工作人员,原来是私有化了,于是张三问工作人员如何进行更改
....
import random
str1 = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
import random
def random_():
        code=''
        for i in range(4):
            num = random.randint(0,len(str1)-1)
            code += str1[num]
        return code

class Person():
    def __init__(self,age):
        self.age = age
        self.__name = '张三'
        self.__title = '法外狂徒'
    def get_title(self,new_title):#私有化可以做验证操作
        a  = random_()
        l = True
        while l:
            print(a)
            o = input('请输入验证码')
            if o == a:
                self.__title = new_title
                l = False
            else:
                a  = random_()   
    def show_title(self):
        print(self.__title)
a = Person(19)
a.get_title('良好公民')
a.show_title()                                      

就这样先,看书去咯!
(有些代码缩减有问题,大家可以搞搞就好了)

谢谢大家!希望能帮助到大家!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LJHandCXY/article/details/107895354