python第二十四天,类属性与对象实现,init方法的作用,绑定方法,绑定方法与普通函数的区别,继承,抽象与继承,派生与覆盖

今日内容:

1.类属性与对象属性

2.init方法的作用

3.绑定方法

4.绑定方法与普通函数的区别(非绑定方法)

5.继承

6.抽象与继承

7.派生与覆盖

1.类属性与对象属性

类中应该进存储所有对象共有的内容:如所有人的国籍相同那就放到类中

对象中存储每个对象独有的内容:如每个人的名字都不同

init方法的作用

init是初始化的缩写用于为对象的属性设置初始值

class Dog:
    # 执行时机:当实例化产生对象时会自动执行该函数
    # 会自动传入需要初始化的对象
    # 初始化必须包含至少一个参数,用于表示对象本身
    # 该函数不允许有返回值
    def __init__(self, age, name, **kwargs):
        print('init run')
        print(self)
        self.age = age
        self.name = name


d = Dog()
print(Dog.__init__)
print(d)
print(d.age)

#
d1 = Dog(1, '小黄')
d2 = Dog(2, '大黄')
print(d1.name, d2.name)

绑定方法

绑定:

  即两个东西绑在一起,方法就是函数,意思就是说 绑定方法 == 绑定函数,默认情况下,再类中定义的方法,都是绑定方法,绑定方法是把函数和对象绑定到一起

为什么要绑定:

  每个应用程序其实本质上都是再处理数据,那就必须明确,要处理的数据再哪里,如何处理,而绑定方法的好处在于,将需要处理的数据,以及处理数据的方法,绑定在一起,这样一来,当你获得一个对象就同时获得数据以及相应的处理方法,简单的调用即可

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

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

    def say_hi(self):
        print('hello i am %s %s岁了' % (self.name, self.age))


# 当你创建对象时,发生了什么?
# 1.产生一个空对象(名称空间)
# 2. 自动调用__init__方法 ,并且把这个对象以及额外的参数传入
p = Person('隔壁老王', 24)  # hello i am 隔壁老王 24岁了
p.say_hi()

p2 = Person('隔壁老梵', 35)  # hello i am 隔壁老梵 35岁了
p2.say_hi()

# 经常使用的数据定义为变量
username = 'jack'
pwd = '123'
db_name = 'QQ'

atm_usr = 'rose'
atm_pwd = '123'


# 用于登陆数据库
def login_data_base(username, pwd, db_name):
    print('%s登陆%s数据库,密码为%s' % (username, db_name, pwd))
    # 输出结果 jack登陆QQ数据库,密码为123


login_data_base(username, pwd, db_name)


def login_atm(usr, pwd):
    print('%s登陆了ATM密码为%s' % (usr, pwd))
    #  输出结果,rose登陆了ATM密码为123


login_atm(atm_usr, atm_pwd)

# 绑定的好处是,将数据以及处理数据的方法绑定在一起,拿到对象就同时拿到数据和处理方法
# 直接调用即可

# 可以这么理解: 面向对象其实就是提高了整合程度,把数据和方法整合到了一起

绑定方法与普通函数的区别(非绑定方法)

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

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

1.绑定方法:

  1.对象绑定方法

  在使用对象调用时会自动传入对象本身

  2.类绑定方法

  @classmethod

  在使用对象时会自动传入类本身

  在使用类来调用时也会自动传入类本身

  单列模式中就会经常使用@classmethod

到底绑给谁?:

  当你的方法执行过程中需要使用到对象中数据时就绑定给对象

  当你的方法执行过程中需要使用到类中的数据时就绑定给类

2.非绑定方法

  即不需要对象中的数据,也不需要类中的数据,那就定义为非绑定方法,就是普通函数

  @staticmethod   静态方法

import time


class Person:
    country = 'China'

    # init 也是绑定方法
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def info(cls):
        print(cls)
        print('info run')

    def sey_hi(self):
        print('hello i an %s' % self.name)

    # 是要输出这个类的一些信息
    @classmethod
    def class_info(cls):
        print('this class %s is module:xxx.py' % cls.__name__)

    # 输出当前时间
    # 不需要访问类也不需要访问对象,所以直接做成非绑定方法

    @staticmethod
    def show_time(self):
        print(time.localtime())


# p = Person('rose', 20)
# p.info()  # 输出:info run

# Person.info()
# print(Person.info)      # <bound method Person.info of <class '__main__.Person'>>

# p = Person('rose', 10)
# p.sey_hi()                # hello i an rose

# p = Person('季禹志',20)
# Person.class_info()         # 结果:this class Person is module:xxx.py


# p = Person('rose', 1)
# p.show_time(1)
# # 获取时间
# Person.show_time(2)


# print(Person.show_time)   # 结果 <function Person.show_time at 0x0000019520119C80>
# print(p.show_time)        # 结果 <function Person.show_time at 0x0000019520119C80>

继承

继承指的是一种关系,在生活中通过继承关系,例如王思聪继承王健林,对于王思聪可以,可以直接使用王健林已经拥有的

被继承的一方(王健林) 称之为父 继承的一方(王思聪) 称之为子

在OOP中 继承描述是类和类之间的关系 例如b类继承a类 b类可以直接使用a类中的属性和方法

a是父类(基类,超类) b是子类(派生类)

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

# 首先,我们定义学生与老师的属性


# 老师的属性
class Teacher:
    school = 'oldboy'

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

    def say_hi(self):
        print('你好啊,我是%s' % self.name)

    def teach(self):
        print('正在教书!')


# 学生继承老师
class Student(Teacher):
    pass

 

抽象与继承

继承之后可以直接使用父类的属性和方法

使用继承时 应该先抽象 在继承

抽象指的是 将一系列类中相同的特征和相同行为抽取 形成一个新的类

会产生一些与原本业务不想关的类

站在不同角度会得到不同的抽象结果

 

# 上述案例中通过继承,学生拥有了老师所有的你内容,但是学生不应该拥有教书这个技能
# 意味着这个继承关系有问题,不合理
# 需要先抽象,再继承

class OldBoyPerson:
    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(OldBoyPerson):
    def teach(self):
        print('正在教书。。。')


class Student(OldBoyPerson):
    pass


# 测试
t = Teacher('owen',38)
t.say_hi()
t.teach()

s = Student('六老师',20)
s.say_hi()

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

Object是所有类的基类 (根类)

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

一切皆对象指的是 在python中您所使用到的任何数据都是对象 int float list dict 模块 包 函数

 属性查找顺序

class A:
    name = 'scot'
    pass


class B(A):
    name = 'rose'
    pass


b = B()

b.name = 'jack'
print(b.name)  # rose 优先查找对象自己



# 查找顺序
# 对象自己 -> 所在的类 -> 所在的父类 -> 父类的父类 -> object

派生与覆盖

子类拥有与父类不同的内容 就称之为派生类

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

'''
覆盖 (重写)
子类中出现了与父类名称相同的属性或方法,就会覆盖掉父类的属性或方法
'''


class A:
    text = '123'

    def show_info(self):
        print('hello,world!')


class B(A):
    text = '321'

    def show_info(self):
        print('你好,我是李xx')

    pass

b = B()
b.show_info()   # 你好,我是李xx
print(b.text)   # 321

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

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 :%s my age :%s my gender: %s " % (self.name,self.age,self.gender),end="")

    
class Student(Person):
    text = "123"
    def __init__(self,name,age,gender,number):
        #======================================================================重点在这里
        # 由于父类已经存在一个方法可以完成这个三参数的初始化
        # 所以可以直接调用父类的初始化完成这部分的初始化工作
        # 方法1
        # Person.__init__(self,name,age,gender) # 指名道姓的调用

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

        # py2的写法
        # super(Student, self).__init__(name,age,gender)
        self.number = number
        #======================================================================

    # 访问父类的属性
    def show_text(self):
        print(self.text)
        print(super().text)

    def say_hi(self):
        super().say_hi()
        print("my number: %s" %  self.number)
        # print("my name :%s my age :%s my gender: %s my number: %s" % (self.name, self.age, self.gender,self.number))


s = Student("jack",20,"man","007")
s.say_hi()
# s.show_text()

猜你喜欢

转载自www.cnblogs.com/liguodeboke/p/10878068.html