概述
类与对象
- 类
对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用 - 对象
由类创建出来的一个具体存在
类的设计示例
设计一个类,实例化两个对象,然后小明跑步,跑完步会去吃东西,小美不跑步,小美喜欢吃东西
- 小明 今年 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(面向对象)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复