一、面向过程与面向对象
1)过程:一组将输入转化为输出的活动。
2)面向过程:针对某一具体活动制定的执行方案,具备一定逻辑顺序,类似于设计一条流水线,可以将复杂的问题流程化、简单化。缺点是扩展性差(如果更改需求,可能整个代码都需要重写)。
3)对象:对象是具体的,指活动中作为具体指定的目标。python中对象由一系列的属性和方法组成,对象的变量叫“实例属性”,对象的函数叫“实例方法”。
4)类:类是抽象的,描述具有许多相同或相似事物特征的集合。python中类由一系列的属性和方法组成,类中的变量叫“类属性”,类中的函数叫“类方法”。
5)类与对象的关系:在python中,对象是类的实例化后的实体,类是对象的模板。实例化后的对象,可以调用类的属性和类的方法。一个类可以有多个对象,类就是创建对象的母版(类似PPT母板)。
6)面向对象:一种描述业务问题与实体之间关系的方法,是对现实世界的模拟。可以编写表示真实世界中的事物和情景中的类,并基于这些类来创建对象。优点:可使程序的维护和扩展变得更简单。
# 面向过程 def demo(x, y): if x > y: print(x) return x elif x < y: print(y) return y else: print(x + y) return x + y demo(12, 12) >>24
# 面向对象 class Cat(object): # 定义一个猫类 print(‘喵喵!‘) def hobby(self): # 实例方法,第1技能 print("我喜欢吃鱼!") def color(self): # 实例方法,第2技能 print("我是灰色的!") jiafei = Cat() # 实例化对象,实例化后才能调用方法。注意:给这个类取名叫加菲,这一类猫叫加菲猫,不是指具体某一只。 jiafei.hobby() # 让豆豆类使用猫的1技能 >>喵喵! >>我喜欢吃鱼!
二、类的创建
# 示例语法: class Name(): # ”类名“通常首字母大写,为了区分”函数名“ name = "变量" # 刻画类的通用特征 def ff_name(self,): # 描述类的行为 pass
class Men(object): # object是最大的类 gender = "male" # 刻画类的通用特征 def strong(self,name): # self名称是约定成俗的,指向类的实例化的对象本身 print(name,"可以干重活!") # 功能1(描述类的行为) def job(self,name): # 设置name参数,可用于区分多个对象的识别 print(name,"工作很努力!") zg_man = Men() # 实例化对象,实例化后可调用类的方法。zg_man定义为中国男人这一类。 zg_man.strong("Ttan") # 实例方法,给这个人取名叫“泰坦”,让他调用1技能 zg_man.job("猪八戒") # “猪八戒”,让他调用2技能 >>Ttan 可以干重活! >>猪八戒 工作很努力!
三、面向对象中属性和方法解析
1)类的属性:一般分为私有属性和公有属性。如果属性中的变量是以两个下划线开始,就表示该属性为私有属性。
2)类的方法:类的方法也分私有方法和公有方法,私有方法不能被模块外的类或对象调用。
3)对象的属性:又称实例属性。只能被相应的对象调用,不能给其他对象共享。
4)对象的方法:又称实例方法(普通方法)。类实例化之后的对象,能够使用的方法。
# 面向对象中的属性与方法: # 【魔术方法(初始化方法)、类方法(@classmethod)、静态方法(@staticmethod)、实例方法(普通方法)】 # 1)魔术方法:以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__。无需调用,自动触发。 # 2)类方法:用@classmethod装饰,默认参数【cls】。作为类的补充附加内容,可以使用实例对象/类名调用。类方法中只能使用类属性。 # 3)静态方法:用@staticmethod装饰的不带 self 参数的方法叫做静态方法,类的静态方法可以没有参数,可以使用实例对象/类名调用。 # 4)实例方法:即普通方法。第一个参数必须是实例本身,一般使用【self】表示,实例方法只能通过实例对象去调用。 class Men(object): gender = "男" # 类属性,公共属性该类中的所有对象均可共享 height = 170 # 1)魔术方法(初始化方法)---相当于设置默认值,程序启动即执行的方法 def __init__(self, name, age): self.name = name self.age = age print("1)魔术方法 -----大家好!------") # 2)类方法,用装饰器 @classmethod---通过cls增加类变量的值,修改类变量属性 @classmethod def modify_height(cls, height_add): cls.height += height_add print("2)类方法 你已经成功增加了平均高度" + str(height_add)) # 3)静态方法,用装饰器@staticmethod @staticmethod def character(): print("3)静态方法 他喜欢做一些对国家有意义的事情!") # 4)实例方法(普通方法) def talk(self): self.name = "爆炸头" # 实例属性 print(f"4)实例方法 {self.name}说话像个孩子!身高为{self.height}") def sleep(self, style_sl): print("4)实例方法 {}中午在{}睡觉!".format(self.name, style_sl)) gd_man = Men("大头", 18) # 类的实例化,实参要传递初始化方法所有参数 print(gd_man.__dict__) # 显示对象的属性值 # Men.modify_height(0.05) # 实例对象和类均可调用类方法 gd_man.modify_height(0.5) # 实例对象,调用 2)类方法 gd_man.character() # 实例对象,调用 3)静态方法 gd_man.talk() # 实例对象,调用 4)实例方法中的talk方法 gd_man.sleep("趴在桌子上") # 实例对象,调用 4)实例方法中的sleep方法 >>1)魔术方法 -----大家好!------ >>{‘name‘: ‘大头‘, ‘age‘: 18} >>2)类方法 你已经成功增加了平均高度0.5 >>3)静态方法 他喜欢做一些对国家有意义的事情! >>4)实例方法 爆炸头说话像个孩子!身高为170.5 >>4)实例方法 爆炸头中午在趴在桌子上睡觉!
四、类的三大特点【封装、继承与多态】
1)封装性:将对象的特征(属性)和行为(方法)保存起来。
2)继承性:通过继承,子类可以快速获取父类的特征与行为。
3)多态性:不同的子类对象,调用相同的父类方法,产生不同的执行结果。
# 1)类的封装 class Card(object): def __init__(self, num, pwd, ban): self.num = num self.pwd = pwd self.__ban = ban # 余额,在属性前加两个下划线"__",变成私有属性(只能在类的内部被访问) def __cun(self): # 私有方法,加两个下划线"__" print("存款") # 设置拿到余额的条件 def getBan(self, numm, pwdd): if numm == self.num and pwdd == self.pwd: return self.__ban else: return "输入错误" card = Card("1001", "123456", 1000) # 开卡 # print(card.getBan("1001","123456")) #通过验证,拿到属性,只有防止出错 print(card._Card__ban) # 也可以通过这种方法,直接拿到私有属性 # 一个下划线拿到Card,两个下划线拿到ban >>1000
# 2-1)类的继承(单继承)---1个子类继承1个父类 class Animal(object): def __init__(self,name): self.name=name def eat(self): print("吃东西") class People(Animal): # Animal继承object,People继承Animal def talk(self): print(‘say hello‘) xiaoming=People("小明") xiaoming.eat() >>吃东西
# 2-2)类的继承(多继承)---1个子类继承多个父类 # A,B继承object;C分别继承A,B(新式类继承,广度优先) class A(object): def text(self): print("AAA") class B(object): def text(self): print("BBB") class C(A,B): print("打印试试!") eee=C() eee.text() print(C.__bases__) # 内置的__bases__属性,通过该属性可以查看该类的所有“直接父类”,该属性返回所有直接父类组成的元组。 >>打印试试! >>AAA >>(<class ‘__main__.A‘>, <class ‘__main__.B‘>)
# 2-3)类的继承(多继承)---多个子类继承1个父类 class Animal(object): # Animal继承object类 def __init__(self, color): self.color = color def eat(self): print("动物在吃") def run(self): print("动物在跑") class Cat(Animal): # Cat类继承Animal类 pass class Dog(Animal): # Dog类继承Animal类 def __init__(self, name, age, color): self.name = name self.age = age super(Dog, self).__init__(color) # 调用父类的初始化方法 def eat(self): print("狗在啃骨头") dog = Dog("小黑", 10, "红色") # 实例化的时候,优先调用子类的方法。 dog.eat() print(dog.color) # print(cat.color) # cat.eat() >>狗在啃骨头 >>红色
# 3)类的多态 class Animal(object): #同一类事物:动物 def talk(self): pass class People(Animal): #动物的形态之一:人,继承Animal的talk方法 def talk(self): print(‘say hello‘) class Dog(Animal): #动物的形态之二:狗,继承Animal的talk方法 def talk(self): print(‘say wangwang‘) class Pig(Animal): #动物的形态之三:猪,继承Animal的talk方法 def talk(self): print(‘say aoao‘) xiaomin=People() xiaomin.talk() xiaohuang=Dog() xiaohuang.talk() xiaobai=Pig() xiaobai.talk() >>say hello >>say wangwang >>say aoao
补充内容:继承中关键字的用法【super】
# 补充内容:类的继承(super关键字调用父类的方法) # super 不仅可以调用父类构造函数,也可调用父类实例方法; # super 可以解决父类名称频繁变化的问题 class Animal(object): def __init__(self, name, age): self.name = name self.age = age def sleep(self): print(‘我要睡觉了!‘) class People(Animal): # 修改继承父类名称 def __init__(self, name, age): self.name = name self.age = age # Animal.__init__(self,name,age) super(People, self).__init__(name, age) # 该行代码并没有出现任何“父类”的名称,如果父类名称频繁变化,只需修改继承的父类名称即可 def talk(self): print(‘say hello‘) super(People, self).sleep() # 调用父类的方法 xiaoming = People("小明", 20) xiaoming.sleep() >>我要睡觉了!
原文:https://www.cnblogs.com/lovezhuzhu1314/p/15060464.html