python基础知识-面向对象编程
一.编程思维
根据面对不同人层显示出来的思维模式不同,而可以将思维分为三种:
1.面向过程编程(穷人思想)-遇到问题马上想到的是解决这个问题的具体逻辑和步骤
2.函数式编程(小资思想)-遇到问题马上想到的是有没有一个已经存在的函数可以解决这个问题,如果没有就造一个(一个函数只具有一个功能)
3.面向对象编程(富豪思想)-遇到问题马上想到有没有一个具有这个功能的对象,如果没有就造对象(一个对象可以同时具有多个功能)
二.类和对象
1.1 类和对象
(1)类就是拥有相同功能或者相同属性的对象的集合,对象就是类的实例
例子:如果人是类,那么张某是一个对象,王某某也是一个对象
(2)定义类(创建类)
定义类:用代码来描述你的这个类是拥有哪些相同功能(用函数)和哪些相同属性(用变量)的对象的集合
1)语法:
class 类名:
类的说明文档
类的内容(包含方法和属性)
2)说明:
a.class-关键字;固定写法
b.类名-由程序员自己命名
(两个要求:是标识符;不是关键字
规范:见名知义;不使用系统函数名,类名和模块名;采用驼峰式命名(大驼峰:每个单词首字母都要大写))
c.类的说明文档-本质就是一个多行注释
d.类的内容-包含定义在类中的函数(方法)和定义在类中的属性(变量)
- 方法包括:对象方法,类的方法,静态方法
- 属性包括:类属性,对象属性
1.2创建对象
对象是通过类来创建的
(1)语法:
类名 ()
class DOg:
pass
dog1=Dog()#创建dog1对象,输出是一个内存地址
1.3方法
(1)定义在类中的函数就是方法
(2)不同方法的使用:
-
对象方法
1)如何定义:直接定义在类中的函数就是对象方法
class A: def fun1(self):#self是系统自动加上去的 print("对象方法")
2)如何调用:以"对象.xxx()"的形式来调用,如果对象方法中需要用到对象属性,由self提供
#首先创建一个对象 变量=类名() a=A() a.fun1() #创建对象之后才能通过对象调用
3)特点
自带参数self,调用函数的时候self不需要传参,系统会自动将当前对象传给self(谁调用self指向谁)
-
类方法
1)如何定义:在定义函数前面加装饰器@classmethod
2)如何调用:以"类名.XXX()"的方式来调用
class A: def func1(self): print("这是对象方法1") def func2(self): print("这是对象方法2") @classmethod def fun3(cls): print("类方法") a1=A() a2=A() a1.func1() a2.func2() #类方法的调用:类名.xxx() A.func3()
3)特点:自带参数cls,调用函数的时候cls不需要传参,系统自动传参
-
静态方法
1)如何定义:定义函数前添加装饰器@staticmethod
2)如何调用:以"类名.XXX()"的方式来调用
class A: def func1(self): print("这是对象方法1") def func2(self): print("这是对象方法2") @classmethod def fun3(cls): print("类方法") @staticmethod def fun4(): print("静态方法") #对象方法 a1=A() a2=A() a1.func1() a2.func2() #类方法的调用:类名.xxx() A.func3() #静态方法 A.func4()
3)特点:没有特点
1.4 初始化(init)
(1)魔法方法的特点:
a.函数以______开头,并且以_______结尾
b.魔法方法不需要程序自己调用,系统会在特地情况下自动调用
(2)两个常见的魔法方法:
a.init:如果在类中添加了______init______方法,那么在创建当前类的对象的时候会自动调用,创建对象的时候需不需要实参,需要几个实参,由类中的______init_______决定。
b.repr:打印类的对象的时候,如果类中添加了_______repr______方法系统会自动调用这个方法,并且将这个方法的返回值返回并且进行打印;在类中添加____repr______方法的时候这个方法的返回值必须是字符串
class B:
def __init__(self):
print("init方法被调用")
a=B()
#init方法被调用
class B:
def __init__(self,name,age,sex):
a=B()
1.5 属性
定义在类中的变量
类中的属性分为:类属性,对象属性
(1)类属性
-
怎么定义:直接在类中定义的变量就是类属性
-
如何使用:以"类名.xxx"的方式去使用
class A: m=100 name="张三" print(A.m) print(A.name)
-
什么时候用:如果属性值不会因为对象不同而不一样,就定义成类属性
(2)对象属性
-
怎么定义:以"self.属性名==属性值"的形式定义在______init______方法中
-
如何使用:以"对象.XXX"的方式使用
class A: ##x和n是对象属性(在使用前先创建对象) def __init__(self): self.x=10 self.n="hello " #通过对象使用对象属性) a=A() print(a.x) print(a.n)
-
什么时候使用:属性值会因为对象不同而 不一样,就定义成对象属性
class Dog:
def __init__(self,name,age):#传参数表示不固定的参数
self.name=name
self.age=age
dog=Dog("旺财",2)#通过对象来使用
print(dog.name,dog.age)
#求圆的周长
class Circle:
pi = 3.1415
def __init__(self, r):#构造函数,构造对象具有的属性
self.r = r
def girth(self):#这是一个对象方法
return Circle.pi * 2 * self.r
round1=Circle(5)#对象方法以对象.XXX的方式来调用
print(round1.girth())
1.6 继承
(1)继承
让子类直接拥有父类的属性和方法
子类-继承者
父类-被继承的类
(2)语法:
class 类名(父类1,父类2...):
类的说明文档
类的内容
注意:定义类的时候没有写父类,那么这个类会默认继承object(基类)
class A:
m=120
def __init__(self):
self.n=200
def fun1(self):
print("对象方法")
@classmethod
def func(cls):
print("对象方法")
@staticmethod
def func3():
print("静态方法")
class B(A):
def __init__(self):#此时打印会报错,因为找不到
super().__init__()#继承当前类的父类的__init__
self.p=10
b=B()
print(b.m)
b.fun1()
b.func3()
b.func()
print(b.n)
#子类中可以添加新的方法。但在添加属性的时候会先看自身有无,如果没有就往上找父类,父类没有就再往上找,一直找到基类,如果基类没有就会报错