Python_Note_Day 6_Class
函数和类的相同与区别:
1. 相同点:构造函数,用于调用,不用重复代码。
2. 区别:函数传给变量是内存地址,以及数据无法保留。
类的调用,即给变量开辟了一个内存空间,用于存放自己的数据。但方法是公用的。
类:
属性:
实例变量
类变量
私有属性__var
方法:
构造方法: def __int__ 用于初始化函数。
析构方法:实例在释放/销毁的时候,会自动执行这个方法。如,实例打开了一些临时文件,连接,销毁的时候就会将其关闭掉。
私有方法
继承:
单继承
多继承:顺序:
2.7 经典类,深度优,新式类,广度优先
3.0 & above, 均是广度优先
class foo(object): #新式类
多态:
接口重用,一种接口,多种实现。可以写一个统一的接口/调用函数,具体调用哪个方法,可以动态的把函数值传进去。
class
Role(
object
):
n = 123 #类变量, 其用途是节省开销。
def
__init__(
self
,name,role,weapon,life_value
=
100
,money
=
15000
): #构造函数
self
.name
=
name #实例变量,作用域就是实例本身,R1的数据不能被R2调用。
self
.role
=
role
self
.weapon
=
weapon
self
.life_value
=
life_value
self
.money
=
money
def
shot(
self
): #类的方法/功能。(动态属性)
print
(
"shooting..."
)
def
got_shot(
self
):
print
(
"ah...,I got shot..."
)
def
buy_gun(
self
,gun_name):
print
(
"just bought %s"
%
gun_name)
r1
=
Role(
'Alex'
,
'police'
,'AK47’)
#生成一个角色,(实例化)r1是Role的对象,即实例。
r2
=
Role(
'Jack'
,
'terrorist'
,'B22’)
#生成一个角色
r1 = Role(self,'Alex','police','AK47')
Role在内存中开辟一个空间,存放实例变量(静态属性)和方法(动态属性)。
r1在将Role赋值的过程中,在内存开辟一个空间,用于存放自己的数据。但方法是公用的。
打印类变量,实例化后与不实例化,打印n都是一样的。但如果类变量与实例变量有重名时,实例化后打印实例变量,而不实例化,打印类变量。
print(Role.n)
print(r1.n,r1.name)
print(r2.n, r2.name)
output:
r1.name = 'David' #实例化后,再给r1.name赋值,值会变成David
r1.bullet_prove = True #实例化后,再加一个属性,只能在r1的内存中有,r2没有. 因为他们都是独自的内存。 删除属性亦然。
r1.n = ‘改变类变量’ #其实只是在r1 的内存中开辟一段新内存,存放n,与类变量n没有关系。
print('r1:' r1.n)
print('r2': r2.n) #r2,没有变量n,即打印类变量。
output:
Role.n = 'ABC' #修改类变量
print(r2.n)
output:
ABC
析构函数: 在实例释放、销毁的时候 自动执行的,通常用于做一些收尾工作,如关闭一些数据库连接,关闭打开的临时文件。
怎么叫销毁,如果你什么也不做,变量在程序结束时,自动销毁。
__del__(self) 是在你的程序释放或销毁的时候就会自动执行。
或者,在程序中,你想明确销毁该变量。你可以手动调用del将其销毁。
私有方法-》方法,私有属性-》变量。
__life_value #只能内部看见,所以在内部加函数访问。
__shot(self) #私有方法。通过r1.__shot()调用。
继承
class pepale: #父类,
def __init__ (self, name, age)
self.name = name
self.age = age
def eat(self):
print('%s is eating...' % self.name)
def talk(self):
print(‘%s is talking...' % self.name)
def sleep(self):
print('%s is sleeping...' %self.name)
class man(people): #(people) -> 继承people父类的属性和方法。
def piao(self):
print(’% is doing .... 20S .... done.' % self.name)
def sleep(self):
people.sleep(self)
print(‘man is sleeping')
class Man(people):
def__init__(self,name,age,money) #如要在子类在变量,(不要在父类加,这样不会其他子类),必须从新构造函数。但问题来了,为了加money这个变量,子类要加入name,age就会把父类给覆盖了,要将父类的变量传到Man这个子类。
people.__init__(self,name,age) #self.name 和 self.age的赋值在父类实现
self.money =money #self.money在这赋值。这样就为Man子类加入了一个参数。
OR
def__init__(self,name,age,money) #上面的另一种写法。
super(Man,self).__init__(name,age)
class Woman(people):
def give_birth(self):
print("%s is giving birth to a baby...." % selfname)
m1 = Man('xiaoJ', 22)
m1.eat()
m1.piao()
w1= Woman(’xiaoA‘,23)
w1.give_birth()
多继承
class Relation(object): #Relation 作为多继承的父类,并不一定要什么变量都带,Man子类已经从People那传入了name的变量。
def make_friends(self,obj):
print('%s is making friends with %s' %(self.name,obj.name))
class Man(People,Relatioin) #继承是有先后顺序的。
def__init__(self,name,age,money):
super(Man,self).__init__(name,age)
self.money = money
m1 = Man('xiaoJ', 22,10)
w1= Woman(’xiaoA‘,23)
m1.make_friends(w1)
继承循序:
Python多态示例:
#_*_coding:utf-8_*_
class
Animal(
object
):
def
__init__(
self
, name):
# Constructor of the class
self
.name
=
name
def
talk(
self
):
# Abstract method, defined by convention only
raise
NotImplementedError(
"Subclass must implement abstract method"
)
class
Cat(Animal):
def
talk(
self
):
print
(
'%s: 喵喵喵!'
%
self
.name)
class
Dog(Animal):
def
talk(
self
):
print
(
'%s: 汪!汪!汪!'
%
self
.name)
def
func(obj):
#一个接口,多种形态
obj.talk()
c1
=
Cat(
'小晴'
)
d1
=
Dog(
'李磊'
)
func(c1)
func(d1)