我是靠谱客的博主 等待大山,最近开发中收集的这篇文章主要介绍python学习记录6(面向对象),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述

在这里插入图片描述

类与对象


  • 对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用
  • 对象
    由类创建出来的一个具体存在

类的设计示例

设计一个类,实例化两个对象,然后小明跑步,跑完步会去吃东西,小美不跑步,小美喜欢吃东西

  • 小明 今年 18 岁,身高 1.75,每天早上跑完步,会去吃东西
  • 小美 今年 17 岁,身高 1.65,小美不跑步,小美喜欢吃东西
    在这里插入图片描述
class Person():
    def __init__(self,name,age,height):
        self.name = name
        self.age = age
        self.height = height
        print("{}今年{}岁,身高{}".format(self.name,self.age,self.height))
        
    def run(self):
        print("每天早上跑步")
        
    def eat(self):
        print("吃东西")
        
if __name__ == "__main__":
    p1 = Person('小明',18,1.75)
    p1.run()
    p1.eat()
    p2 = Person('小美',17,1.65)
    p2.eat()

运行结果

小明今年18岁,身高1.75
每天早上跑步
吃东西
小美今年17岁,身高1.65
吃东西

内置方法

class Cat():
	# __init__初始化对象
	def __init__(self,name):
		self.name = name
		print("这是只叫{}的猫".format(self.name))
		
	# __del__删除对象时调用该方法
	def __del__(self):
		print("The cat is missing")
	
	# __str__输出时调用该方法
	def __str__(self):
		return "喵"
	
	def action(self):
		print("在玩球")

if __name__ == "__main__":
	cat = Cat("Jerry")
	print(cat)
	cat.action()
	del cat
	# dir查看类里的所有方法
	print(dir(cat))

运行结果

这是猫Jerry

玩球
猫失踪了
[’__class__’, ‘__del__’, ‘__delattr__’, ‘__dict__’, ‘__dir__’, ‘__doc__’, ‘__eq__’, ‘__format__’, ‘__ge__’, ‘__getattribute__’, ‘__gt__’, ‘__hash__’, ‘__init__’, ‘__init_subclass__’, ‘__le__’, ‘__lt__’, ‘__module__’, ‘__ne__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘__weakref__’, ‘action’]

私有属性与方法

class Student():
    def __init__(self,name):
        self.name = name
        self.__grade = 59
        
    def __test(self):
        print("成绩是{}".format(self.__grade))
        
        
p = Student("tom")
print(p._Student__grade)
print(p._Student__test())
print(p.__test()) # 访问出错,无法直接访问

运行结果

59
成绩是59
None
-----------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-95c719466d00> in <module>
11 print(p._Student__grade)
12 print(p._Student__test())
—> 13 print(p.__test()) # 访问出错,无法直接访问
AttributeError: ‘Student’ object has no attribute ‘__test’

封装、继承、多态

class Animal():
	def __init__(self,name,age):
		self.name = name
		self.age = age
	
	def __str__(self):
        return ("{}{}岁了".format(self.name,self.age))
        
    def drink(self):
        print("{}在喝水".format(self.name))
        
    def action(self):
        print("{}在奔跑".format(self.name))
        
        
class Dog(Animal):
    
    def eat(self):
        print("{}在吃骨头".format(self.name))
        
        
class Tengu(Dog):
    
    def action(self):
        print("{}在飞".format(self.name))
       
        # super()调用原本在父类中的方法
        super().action()
    
        
if __name__ == "__main__":
    tom = Dog("tom",10)
    print(tom)
    tom.drink()
    tom.eat()
    tom.action()
    
    print('*'*50)
    
    jerry = Tengu("jerry",50)
    print(jerry)
    jerry.eat()
    jerry.drink()
    jerry.action() 

运行结果

tom10岁了
tom在喝水
tom在吃骨头
tom在奔跑
**************************************************
jerry50岁了
jerry在吃骨头
jerry在喝水
jerry在飞
jerry在奔跑

类属性与类方法

  • 类属性

    class People(object):
    	count = 0
    
    	def __init__(self,name):
        	self.name = name
        
        	People.count+=1
       
    
    p1 = People("tom")
    p2 = People("jerry")
    p3 = People("mike")
    print(People.count)
    

    运行结果

    3

  • 类方法与静态方法
    类方法需要使用装饰器@classmethod来标识,第一个参数应该为cls
    静态方法用修饰器@staticmethod标识,通过类名.调用静态方法,不需要创建对象

    class Dog(object):
     count = 0
    
     	@classmethod
    	def show_num(cls):
        	print("有%d条狗"%cls.count)
    
    	def __init__(self):
        	Dog.count+=1
        
    	@staticmethod
    	def run():
        	print("跑")
        
    dog1 = Dog()
    dog2 = Dog()
    print(Dog.count)
    Dog.show_num()
    Dog.run()
    

    运行结果

    2
    有2条狗

单例模式

让类创建的对象在系统中只有唯一的一个实例
每一次执行类名()返回的对象,内存地址是相同的

class Dog(object):
    instance = None
    
    def __new__(cls,*args,**kwargs):
        
        if cls.instance is None:
            cls.instance = super().__new__(cls)
            
        return cls.instance
    
dog1 = Dog()
print(dog1)
dog2 = Dog()
print(dog2)        

运行结果:

<main.Dog object at 0x000002B2284E40B8>
<main.Dog object at 0x000002B2284E40B8>

工厂模式

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类

class Animal():
	def eat(self):
		pass
	def voice(self):
		pass

class Dog(Animal):
	def eat(self):
		print("eat meat")
	def voice(self):
		print("wang")

class Cat(Animal):
	def eat(self):
		print("eat fish")
	def voice(self):
		print("mow")

# 工厂类
class FactoryAni():
	def creatAni(self,aniType):
		if aniType == 'Dog':
			return Dog()
		if aniType == 'Cat':
			return Cat()

fa = FactoryAni()
d = fa.creatAni('Dog')
d.eat()
d.voice()

运行结果:

eat meat
wang

异常

捕获异常

try:
	num = int(input("请输入整数:"))
except:
	print("请输入正确的数字")

在这里插入图片描述
在这里插入图片描述

try:
	code
except error1:
	how to solve error1
except (error2, error3):
	how to solve error2, error3
except Excepion as result:
	# 打印错误信息
	print(result)
else:
	# 无异常执行
finally:
	# 是否有异常都执行
	

抛出异常
根据业务需求主动抛出异常

def input_passward():
	pwd = input("输入密码(不低于8位):")
	if len(pwd)>=8:
		return pwd
	
	# 若少于8位
	print("主动抛出异常")
	# 创建异常对象
	ex = Exception("密码长度不够")
	# 抛出
	raise ex

try:
	print(input_passward())
except Exception as result:
	print(result)

在这里插入图片描述

最后

以上就是等待大山为你收集整理的python学习记录6(面向对象)的全部内容,希望文章能够帮你解决python学习记录6(面向对象)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部