day6-面向对象补充之知识点回顾
self关键字
面向对象里面的self是什么?
我们知道面向对象编程就是把函数嵌套了一层类,放在其里面,本质其实就是函数,而self放到了函数的上面,它其实就是个形式参数,而这个形式参数不需要我们给其传值,所以:
实质:self代指的就是调用当前方法的那个对象
class Foo:
#静态字段
#公有属性
country = "中国" #只保存一份
def __init__(self,name,count):
#普通字段
#普通属性
self.Name = name
self.Count = count
def bar(self):
pass
obj1 = Foo("河南",120000)
obj1.bar
obj2 = Foo("山东",10000)
obj2.bar
解析:country = “中国”属于公共属性(静态字段),如果属于静态字段,那么类名为Foo里面有__init__方法和bar()方法,还有country = "中国",在创建对象时,如obj1,obj2,每个对象想要找"中国"的话,原理是和找方法的方式一样:先通过类对象指针—>找到类Foo—>类Foo再帮你找它里面的东西,这样的话,country = "中国"这种静态字段(公共属性)只保存一份且保存在类里面。不需要在每个对象里面保存一份了。

静态字段的适用场景
以后创建的每个对象中保存相同的值时,可以使用静态字段
封装
类中封装了:字段、方法
对象中封装了:普通字段的值
不仅可以封装字段,还可以封装对象
class F1:
def __init__(self,n):
self.N = n
print("F1")
class F2:
def __init__(self,arg1):
self.a = arg1
print("F2")
class F3:
def __init__(self,arg2):
self.b = arg2
print("F3")
o1 = F1("Dick")
o2 = F2(o1)
o3 =F3(o2)
######输出Dick####
# o3 =F3(o2)
o3.b = o2 ,o3 ====> o2
# o2 = F2(o1)
o3.b.a = o1
# o1 = F1("Dick")
o3.b.a.N = "Dick"
继承
原理:子类继承父类,对象调用方法时,先从自己的类中去找,找不到,就会去找父类中的方法。
class F1:
def __init__(self):
print('F1')
def a1(self):
print("F1a1")
def a2(self):
print("F1a2")
class F2(F1):
def __init__(self):
print("F2")
def a1(self): #4
self.a2() #5
print("F2a1") #7
def a2(self):
print("F2a2")
class F3(F2): #3
def __init__(self):
print("F3")
def a2(self): #6
print("F3a2")
obj = F3() #1
obj.a1() #2
#输出
F3a2
F2a1
解析:先执行#1,然后#2,查找#3中没有a1(),所以在父类里面找,执行了#4里面的#5,此时self(形式参数)是指调用此函数的对象即obj = F3()的F3的对象,所以会重新回到F3对象里面类对应的方法,那么就是#6,执行完再执行#7,结束。
静态方法
1.类的组成
- 字段:1.普通字段(保存在对象中),2静态字段(保存在类中)
- 方法:普通方法(保存在类中,用对象去调用,至少有self参数)
class F1:
country = "中国" #静态字段
def __init__(self,name,。。。。。。):
self.name = name #普通字段
def a1(self): #普通方法
print(self.name,。。。。。。)
obj = F1("Dick")
obj.a1()
#普通字段
obj.name
#静态字段(推荐使用),当然也可以使用对象来访问静态字段obj.country,但是为了有一个好的代码习惯。
F1.country
解析:当我们执行此代码时,传入一个Dick的参数,同时调用obj.a1()时,那么程序会将封装在对象里面的参数Dick进行输出,在这种情况下,我们已经把Dick这些值封装到对象里了,这时,此对象处于可用状态,但是如果我们把参数去掉,直接在函数里面输出:
class F1:
def a1(self): #普通方法
print(“Dick”)
obj = F1() #对象
obj.a1()
这时,在调用obj.a1时,因为对象没有传入任何参数,所以没有在对象里封装任何东西,但是输出了东西,Python知道我们没有给这个对象传入任何参数,此时,Python知道它是一个对象,会给它传一些东西,那么,这个对象还是会占用内存空间,所以,在这种情况下,我们用这个对象访问这个类,白白的创建这个对象。这个时候Pycharm也会提示,因为这里面没有使用对象里面的东西,我们没有封装东西。
在这种情况下,如果你的方法和对象里面的值,没有任何关系的时候,这么去调用,就会白白的浪费内存空间,所以此时我们使用静态方法。
2.静态方法
用法:当对象不需要传入参数时,去创建对象有些浪费,白白浪费内存空间,所以还不如直接用类名直接去调用,这个类似于函数。
特点:1.保存在类中,2.调用者类(不需要创建对象),3.可以有任意个参数(也可以没有)
class F1:
@staticmethod
def a1(s1,a2): #无需传入参数,但是可以声明多个值
print(“Dick”)
#obj = F1() #创建对象(普通方法)
F1.a1(1,2) #静态方法(可以不创建对象,直接通过类调用方法,类似函数调用)

浙公网安备 33010602011771号