Python - 面向对象编程

python面向对象学习记录

定义类

1
2
3
4
5
class Class_name(object):
def __init__(self,name):
self.name = name #这个是 实例变量(也叫成员属性)
def bulk(self): #这个是成员方法
pass
  • 1.其中object指继承的哪个类,所有的类都是object的派生类,所以没有找到合适的继承类时,就填写object

  • 2.init叫做构造函数,用来初始化类,和传递参数,这里值得一提的是,init的初始化方式:在实例化一个类的时候,class1 = Class_name(“admintony”) ,这样其实是把class1作为self这个变量也传递进来,然后再进行class1.name = name 这样的赋值。

  • 3.在类中创建的函数叫做成员方法,所有的成员方法都有一个默认的参数self,自动把实例化的对象传递进去,调用时不需要填写该参数

实例化

1
2
3
class1 = Class_name("admintony")
print(class1.name)
class1.bulk

类变量

类变量:类似于global变量,每个实例都可以调用的,且可以通过类名来调用这个变量 (存放所有类共用的属性

1
2
3
4
5
6
7
class Class_name(object):
c_name ="admintony.com"
def __init__(self,name):
self.name = name
class1 = Class_name("admintony")
print(Class_name.c_name) # ==>>>admintony.com
print(class1.c_name) # ==>>>admintony.com
  • 1>可以在class1中改写c_name这个值,但是不影响其他的实例

  • 2>Class_name.c_name = “com” 这样可以影响到其他的实例

  • 3>如果类变量是可变类型的变量(list),那么在class1中修改了此变量会影响其他实例

增加/删除成员变量

增:根据init的实质可以知道,在实例化后仍然可以通过class1.age = 19 来给class1这个实例增加新的属性

删:del class1.age #即可删除age这个成员属性

析构函数

析构函数是在实例销毁或者被释放的时候执行的函数,常用来做一些收尾工作

1
2
3
4
5
class Class_name(object):
def __init__(self,name):
self.name = name
def __del__(self):
print("析构函数")

实例销毁或者被释放的情况:

  • <1>代码执行完成,程序退出。

  • <2>del 实例名 #这里利用了python动态回收内存的方法,删除变量名,该空间就会被释放。

私有属性,私有方法

只能在内部使用的变量或者方法叫做私有变量(属性)、私有方法

1
2
def __init__(self,name):
self.__name = name

此时的__name就是一个私有属性,只能在类的内部访问,如果想要查看他要写一个函数来返回他。

1
2
def getname(self):
return self.__name

私有方法和私有变量类似,在方法名前面加两个下划线。

面向对象的特性

封装

封装就是提供接口,但是不告诉你类中的结构和实现的方法。

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class People(object):
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print("%s is eating...."% self.name)
def sleep(self):
print("%s is sleeping...." %self.name)
def cry(self):
print("%s is crying...."%self.name)
class Man(People):
def eat(self):
print("man %s is eating...."%self.name)
def sleep(self):
People.sleep(self)
print("a man is sleeping....")

man = Man("admintony",19)
man.eat()
man.cry()
man.sleep()
  • 1>继承以后可以重写父类的方法。

  • 2>继承后如果在某个函数中需要调用父类的方法:父类.方法(self) 一定记着传self进去,因为这个时候你调用的时候父类不知道self的指向。

  • 3>重构init():super(子类名,self).init(父类要的参数) 然后再写子类处理其他的参数。

1
2
3
4
5
6
7
8
9
class People(object):
def __init__(self,name,age,passwd=1):
self.name = name
self.age = age
self.passwd = passwd
class Man(People):
def __init__(self,name,age,sex):
super(Man,self).__init__(name,age)#这里可以传递默认参数也可以不传递
self.sex = sex
  • 4>多继承:多个父类的构造函数的参数个数相同,继承时写的父类顺序,会影响初始化时,各个父类的init()的执行顺序。[或者多个父类只写一个构造函数]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class People(object):
def __init__(self,name,age,passwd=1):
self.name = name
self.age = age
self.passwd = passwd
class People2(object):
def p_2(self):
print("Hello %s"%self.name)
class Man(People,People2):
pass
man = Man("admintony",19)
man.p_2()

# >>>Hello admintony

多态

`