1. 初始化函数

class Person:
    color = "balck"
    def eat(self):
        print("正在吃饭")

# 创建对象又称为实例化,产生的对象也成为实例
p1 = Person()
print(p1)            # <__main__.Person object at 0x000001E8C23E8A58>
print(p1.color)      # balck
print(p1.__dict__)   # {}

p2 = Person()
print(id(p1.color))     # 2099202917912
print(id(p2.color))     # 2099202917912
print(id(Person.color)) # 2099202917912

# 当修改某一个对象的属性时,不会影响其他对象和类
p2.color = "yellow"
print(p1.color)         # balck
print(p2.color)         # yellow
print(Person.color)     # balck

# 类中仅存储所有对象相同的内容
# 如果每个对象的所有属性都不同则应该放到对象自己的名称空间中

 

2. __init__函数

在创建对象时发生了什么:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

1. 产生一个空对象(名称空间)

2. 自动调用__init__方法,并且把这个对象以及额外的参数传入

# __init__函数
# 执行时机:当实例化产生对象时会自动执行该函数
# 会自动传入需要初始化的对象
# 初始化必须包含至少一个参数 用于表示对象本身
# 该函数不允许有返回值

class Dog:
    def __init__(self,name,age):
        print("=====>>>>>")
        self.name = name
        self.age = age

d = Dog("wangyong","25")
print(d)         # <__main__.Dog object at 0x000001FC97BE8A20>
print(d.age)     # 25
print(d.name)    # wangyong

 

3. 绑定方法和非绑定方法

3.1 绑定方法

绑定即两个东西绑在一起 

方法就是函数  

那就是说绑定方法 == 绑定函数

默认情况下 在类中定义的方法 都是绑定方法

绑定方法 是把函数和对象绑定到一起 

为什么要绑定:

每个应用程序其实本质上都是在处理数据,那就必须明确 要处理的数据在哪里,如何处理 

绑定方法的好处在于,将需要处理的数据 以及处理数据的方法绑定在一起,这样一来 当你获得一个对象就同时获得 数据以及 相应的处理方法 ,简单的调用即可

 

3.2 绑定方法与普通函数的区别

当使用类调用时,就是一个普通函数 有几个参数就得传几个参数

当用对象来调用时,是一个绑定方法了,会自动将对象作为第一个参数传入

print(d.eat("qwe"))    # qwe正在吃饭。。。。
Dog.eat(d,"asd") # asd正在吃饭。。。。

  

3.3 绑定方法与非绑定方法

3.3.1 绑定方法

1 对象绑定方法:在使用对象调用时会自动传入对象本身

2 类绑定方法:@classmethod 在使用对象调用时会自动传入类本身,在使用类来调用时也会自动传入类本身

3.3.2 非绑定方法

@staticmethod

既不需要对象中的数据,也不需要类中的数据,就定义为非绑定方法,就当作普通函数使用,谁调用都不会自动传参

 

import time
class Person:

    country = "china"
    # init 也是绑定方法
    def __init__(self,name,age):    # 在使用对象调用时会自动传入对象本身
        self.name = name
        self.age = age

    @classmethod               # 类绑定方法:@classmethod 在使用对象调用时会自动传入类本身,在使用类来调用时也会自动传入类本身
    def info(cls):
        print(cls)
        print("info run")


    def say_hi(self):           # 在使用对象调用时会自动传入对象本身
        print("hello i am %s" % self.name)

    @classmethod                # 类绑定方法:@classmethod 在使用对象调用时会自动传入类本身,在使用类来调用时也会自动传入类本身
    def class_info(cls):
        print("this class is %s"%cls.__name__)

    @staticmethod
    def show_time(self):
        print(time.localtime()) # 既不需要对象中的数据,也不需要类中的数据,就定义为非绑定方法,就当作普通函数使用,谁调用都不会自动传参

p = Person("rose",20)

p.info()
        # <class '__main__.Person'>
        # info run
Person.info()
        # <class '__main__.Person'>
        # info run

p.say_hi()         # hello i am rose
Person.say_hi(p)   # hello i am rose

p.show_time(1)
Person.show_time(2)

p.class_info()    # this class is Person

 

  

4. 继承

4.1 继承

继承描述的是类与类之间的关系。例如b类继承a类,b类就可以直接商用a类的属性和方法

a类为父类(基类,超类)

b类是字类(派生类)

好处:极大的提高了代码的复用性

使用方法:

class 子类名称(父类名称):

  pass

4.2 抽象与继承

抽象指的是将一系列类中相同的特征和相同的行为抽取形成一个新的类,这个过程会产生一些原本业务不相关的类

class OldBoyPeople:
    school = "oldboy"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hi(self):
        print("hello,i am %s" % self.name)

class Teacher(OldBoyPeople):

    def teach(self):
        print("正在教书.....")

class Student(OldBoyPeople):
    pass

t = Teacher("qwe",35)
t.say_hi()   # hello,i am qwe
t.teach()    # 正在教书.....

s = Student("asd",18)
s.say_hi()   # hello,i am asd

 

4.3 object是所有类的基类(根类)

在python3中任何类都直接或者间接继承自object

object提供一系列方法,这样一来,无论是什么样的类,都可以直接是object中已经存在的方法

 

一切皆对象:一切皆对象指的是在python中所使用到的数据都是对象

 

4.4 属性的查找顺序

对象自己 --> 所在的类 --> 所在的类的父类 --> ...-->父类

4.5 派生与覆盖

派生:子类中与父类不同的内容就称之为派生类

覆盖:指的是子类出现了与父类完全相同(属性/方法)名称,根据查找顺序,就会优先找子类的,即覆盖了父类的内容

4.6 在子类中访问父类中已有的方法或属性

# 子类中使用父类的属性或方法
class Person:
    text = "321"
    def __init__(self,name ,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

    def sleep(self):
        print("人类 躺着睡 午睡")

    def say_hi(self):
        print("my name is %s:  my age is %s:  my gender is %s:" % (self.name,self.age,self.gender),end="")


class Student(Person):
    text = "123"

    def __init__(self,name,age,gender,number):

        # 由于父类已经存在一个方法可以完成这三个参数的初始化,
        # 所以可以直接调用父类的初始化完成这部分的初始化工作

        # 方法一    # 指名道姓的调用
        # Person.__init__(name,age,gender)

        # 方法二 在py2中不支持
        super().__init__(name,age,gender)

        # 方法三 在py2中写法
        # super(Student,self).__init__(name,age,gender)

        self.number = number

    def show_text(self):
        print(self.text)

    def say_hi(self):
        super().say_hi()
        print("my number %s" % self.number)

s = Student("jack",20,"man","007")
s.say_hi()     # my name is jack:  my age is 20:  my gender is man:my number 007

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄