Python面向对象
一 面向对象
1.编程的方式
- 面向过程:根据业务逻辑从上到下写垒代码
- 函数试:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类封装,各种包,让开发“更快更好更强”---目的就是更方便
2.什么是面向对象
面向对象就不像面向过程那样按照功能划分模块了,它所关注的是软件系统有哪些参与者,把这些参与者称为对象,找出这些软件系统的参与者也就是对象之后,分析这些对象有哪些特征、哪些行为,以及对象之间的关系,所以说面向对象的开发核心是对象
3.什么是类
类是对象的类型,具有相同属性和行为事物的统称。类是抽象的,在使用的时候通常会找到这个类的一个具体存在。
4.什么是对象
万物皆对象,对象拥有自己的特征和行为。
当这个东西不存在的时候就是一个类,当他实例化就是一个对象
5.类和对象的关系
类是对象的类型,对象是类的实例。类是抽象的概念,而对象是一个你能够摸得着,看得到的实体。二者相辅相成,谁也离不开谁。(笼统的大多划归为类,具体的算是对象)
二 定义类
- 类由三部分组成
- 类的名称:类名
- 属性:对象的属性
-
方法:对象的方法
''' 类定义 class 类名(): # 类文档说明 属性 方法 ''' class person(): ''' 这是一个人类 ''' country = '中国' #声明类属性,并且赋值 #实例属性通过构造方法来声明 #self不是关键字,代表的是当前而对象 def __init__(self,name,age,sex): #构造方法 #构造方法不需要调用,在实例化的时候自动调用 # print('我是构造方法,在实例化得时候调用') self.name = name #通过self 创建实例属性,并且赋值 self.age = age self.sex = sex #创建普通方法 def getName(self): print('我的名字叫:%s,我来自%s'%(self.name,person.country)) #在方法里面使用实例属性 #实例化对象 people01 = person('joe',19,'男') #在实例化的时候传递参数 #这个people01 就要具有三个属性,并且可以使用getName方法 people01.getName();
访问是通过对象明.属性名 访问实列属性(对象属性)
通过内置的方法访问属性
- getattr(obj, name[, default]) : 访问对象的属性
- hasattr(obj,name) : 检查是否存在一个属性
- setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性
- delattr(obj, name) : 删除属性
- 注意:name需要加单引号,obj为实例化对象名称
内置类属性
- dict : 类的属性(包含一个字典,由类的属性名:值组成,以字典的形式返回) 实例化类名. dict
- doc :类的文档字符串 (类名. 查看使用的这是一个什么类)实例化类名. doc
- name : 类名,实现方式,返回类名 类名. name
- bases : 类的所有父类构成元素(包含了以个由所有父类组成的元组)
init ()构造方法和self
- init ()是一个特殊的方法属于类的专有方法,被称为类的构造函数或初始化方法,方法的前面和后面都有两个下划线。
- 这是为了避免Python默认方法和普通方法发生名称的冲突。每当创建类的实例化对象的时候,init ()方法都会默认被运行。作用就是初始化已实例化后的对象。
- 在方法定义中,第一个参数self是必不可少的。类的方法和普通的函数的区别就是self,self并不是Python的关键字,你完全可以用其他单词取代他,只是按照惯例和标准的规定,推荐使用self。
name
- name :如果是放在Modules模块中,就表示是模块的名字;
- 如果是放在Classs类中,就表示类的名字;
- main :模块,xxx.py文件本身.被直接执行时,对应的模块名就是 main 了
- 可以在if name == “ main ”:
- 中添加你自己想要的,用于测试模块,演示模块用法等代码。
- 作为模块,被别的Python程序导入(import)时,模块名就是本身文件名xxx了。
三 继承和多态
在现实生活中,继承一般指的是子女继承父辈的财产。那么在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中可以描述为猫和狗都继承自动物。同理,波斯猫和家猫都继承自猫。而斑点狗,泰迪都继承之狗。程序中当我们定义一个class的时候,可以从某个现有的class继承,新的class称之为子类(Subclass),而被继承的class称之为基类、父类或超类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
class Animal():
def __init__(self,name,food):
self.name = name
self.food = food
def eat(self):
print('%s爱吃%s'%(self.name,self.food))
#声明一个子类继承animal
class Dog(Animal):
def __init__(self,name,food,drink):
#加载弗雷构造方法
# Animal.__init__(self,name,food,)
super(Dog, self).__init__(name,food)
self.drink = drink #子类自己的属性
#子类自己的方法
def drinks(self):
print('%s爱喝%s'%(self.name,self.drink))
class Cat(Animal):
def __init__(self,name,food,drink):
#加载弗雷构造方法
# Animal.__init__(self,name,food,)
super(Cat, self).__init__(name,food)
self.drink = drink #子类自己的属性
#子类自己的方法
def drinks(self):
print('%s爱喝%s'%(self.name,self.drink))
#重写父类的eat
def eat(self):
print('%s特别爱吃%s'%(self.name,self.food))
dog1 = Dog('金毛','骨头','可乐')
dog1.eat()
dog1.drinks()
cat1 = Cat('波斯猫','秋刀鱼','雪碧')
cat1.eat()
cat1.drinks()
多继承
Python中多继承的语法格式如下:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
需要注意圆括号中父类的顺序,如果继承的父类中有相同的方法名,而在子类中使用时未指定,python将从左至右查找父类中是否包含方法---简而言之就是全面的父类中有就用前面父类的。
多态
多态是在继承的基础下实现的
四 类属性和实例属性
类属性与实例属性
- 属性
尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。实例属性在每创造一个类是都会初始化一遍,不同的实例的实例属性可能不同,不同实例的类属性都相同。1:实例属性:
在init(self,...)中初始化
内部调用时都需要加上self.
外部调用时用“对象名.属性名”调用
2:类属性:
在init()里初始化
在内部用classname.类属性名调用
外部既可以用classname.类属性名又可以用instancename.类属性名来调用
3:私有属性:
双下划线__开头:外部不可通过“对象名.属性名”来访问或者更改实际将其转化为了“_类名属性名”(外部无法通过点得方式进行访问,外部需要预留接口(set和get方法)去访问或者修改)
强制访问---实列化对象名.类名属性名(不要去用)
五 类方法和静态方法
1:普通方法:
def fun_name(self,...):
pass
外部用实例调用
2:静态方法:通过装饰器 @staticmethod 装饰
不能访问实例属性
参数不能传入self
与类相关但是不依赖类与实例的方法
3:类方法:@classmethod
不能访问实例属性
参数必须传入cls
必须传入cls参数(即代表了此类对象-----区别------self代表实例对象),并且用此来调用类属性:cls.类属性名
代码演示
class person():
'''
这是一个人类
'''
country = '中国' #声明类属性,并且赋值
#实例属性通过构造方法来声明
#self不是关键字,代表的是当前而对象
def __init__(self,name,age,sex,address,country): #构造方法
#构造方法不需要调用,在实例化的时候自动调用
# print('我是构造方法,在实例化得时候调用')
self.name = name #通过self 创建实例属性,并且赋值
self.age = age
self.sex = sex
self.__address = address #双下划线开头的属性是私有属性
person.country = country
#创建普通方法
def getName(self):
#类属性的使用通过类名.属性名使用 这是规范
#私有属性在类里面使用正常使用
print('我的名字叫:%s,我来自%s,我住在%s'%(self.name,person.country,self.__address)) #在方法里面使用实例属性
#创建一个静态方法
@staticmethod
def aa(): #不需要传递实例
#静态方法不能访问实例属性
#静态方法只能访问类属性
print('我的名字叫:%s' % person.country) # 在方法里面使用实例属性
#类方法
@classmethod
def bb(cls,n): #class 也不是关键字
#类方法不能访问实例属性
cls.country = n
print('我的名字叫:%s' %cls.country ) #就用cls.类属性
#实例化对象
people01 = person('joe',19,'男','上海')
#通过对象来调用静态方
people01.aa()
#通过对象来调用类方法
people01.bb()
#静态方法和类方法的调用,推荐使用类名的方式去调用
#通过类名来调用静态方法
person.aa()
#通过类名来调用类方法
person.bb('usa')
共有 0 条评论