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)
原文地址:https://www.cnblogs.com/tlfox2006/p/7406764.html