Python面向对象编程(二)

目录
  • 一、对象的继承
    • 1、类的构造函数继承__init__():
    • 2、继承关系中,对象查找属性的顺序
  • 二、类的派生
    • 1、派生方法一(类调用)
    • 2、派生方法二(super)
  • 三、类的组合
  • 四、多父类继承问题
    • 1、新式类(MRO)列表
    • 2、super()方法详解
  • 五、抽象类
  • 六、类的封装
    • 1、私有属性:双下划线的方式__x
    • 2、外部使用变形访问:_类名__x
    • 3、在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的
  • 七、类的属性(property)
    • 1、装饰器方式 (推荐使用)
    • 2、经典类和新式类的属性方式:
    • 3、类属性方式
    • 3、实例
  • 八、实例方法及非绑定实例方法
    • 1、实例方法
    • 2、类方法(@classmethod )
    • 3、静态方法(@staticmethod )
  • 九、类的专有方法:
    • 运算符重载

Python面向对象编程(一)

Python面向对象编程(二)

Python面向对象编程(三)

一、对象的继承

Python中支持一个类同时继承多个父类

class Parent1:
    pass

class Parent2:
    pass

class Sub1(Parent1, Parent2):
    pass

使用__bases__方法可以获取对象继承的类

print(Sub1.__bases__)
# (<class '__main__.Parent1'>, <class '__main__.Parent2'>)

在Python3中如果一个类没有继承任何类,则默认继承object类。

print(Parent1.__bases__)
#('object'>,)

1、类的构造函数继承__init__():

  • 子类需要自动调用父类的方法:子类不重写__init__()方法,实例化子类后,会自动调用父类的__init__()的方法。
  • 子类不需要自动调用父类的方法:子类重写__init__()方法,实例化子类后,将不会自动调用父类的__init__()的方法。
  • 子类重写__init__()方法又需要调用父类的方法:需要使用super关键词。

2、继承关系中,对象查找属性的顺序

对象自己——>对象的类——>父类——>父类。。。

class OldboyPeople:
    """由于学生和老师都是人,因此人都有姓名、年龄、性别"""
    school = 'oldboy'

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

class OldboyStudent(OldboyPeople):
   def choose_course(self):
        print('%s is choosing course' % self.name)

class OldboyTeacher(OldboyPeople):
    def score(self, stu_obj, num):
        print('%s is scoring' % self.name)
        stu_obj.score = num

stu1 = OldboyStudent('tank', 18, 'male')
tea1 = OldboyTeacher('nick', 18, 'male')

print(stu1.school)
# oldboy

print(tea1.school)
# oldboy

print(stu1.__dict__)
# {'name': 'tank', 'age': 18, 'gender': 'male'}

tea1.score(stu1, 99)
# nick is scoring

print(stu1.__dict__)
# {'name': 'tank', 'age': 18, 'gender': 'male', 'score': 99}

二、类的派生

子类中新定义的属性的这个过程叫做派生,子类在使用派生的属性时始终以自己的为准。

1、派生方法一(类调用)

指名道姓访问某一个类的函数:该方式与继承无关

class OldboyPeople:
    """由于学生和老师都是人,因此人都有姓名、年龄、性别"""
    school = 'oldboy'

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

class OldboyStudent(OldboyPeople):
    """由于学生类没有独自的__init__()方法,因此不需要声明继承父类的__init__()方法,会自动继承"""

    def choose_course(self):
        print('%s is choosing course' % self.name)

class OldboyTeacher(OldboyPeople):
    """由于老师类有独自的__init__()方法,因此需要声明继承父类的__init__()"""

    def __init__(self, name, age, gender, level):
        OldboyPeople.__init__(self, name, age, gender)
        self.level = level  # 派生

    def score(self, stu_obj, num):
        print('%s is scoring' % self.name)
        stu_obj.score = num

stu1 = OldboyStudent('tank', 18, 'male')
tea1 = OldboyTeacher('nick', 18, 'male', 10)

print(stu1.__dict__)
# {'name': 'tank', 'age': 18, 'gender': 'male'}

print(tea1.__dict__)
# {'name': 'nick', 'age': 18, 'gender': 'male', 'level': 10}

2、派生方法二(super)

  • 严格以继承属性查找关系
  • super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
  • super().__init__(不用为self传值)
  • super的完整用法是super(自己的类名,self),在python2中需要写完整,而python3中可以简写为super()。
class OldboyPeople:
    school = 'oldboy'

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

def choose_course(self):
        print('%s is choosing course' % self.name)
class OldboyStudent(OldboyPeople):
    def __init__(self, name, age, sex, stu_id):
        # OldboyPeople.__init__(self,name,age,sex)
        # super(OldboyStudent, self).__init__(name, age, sex)
        super().__init__(name, age, sex)
        self.stu_id = stu_id

    def choose_course(self):
        print('%s is choosing course' % self.name)

stu1 = OldboyStudent('tank', 19, 'male', 1)
super(OldboyStudent,stu1).choose_course() #用子类对象调用父类已被覆盖的方法
print(stu1.__dict__)
# {'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1}

三、类的组合

类对象可以引用/当做参数传入/当做返回值/当做容器元素,类似于函数对象。

  • 组合是用来解决类与类之间代码冗余的问题

组合可以理解成多个人去造一个机器人,有的人造头、有的人造脚、有的人造手、有的人造躯干,大家都完工后,造躯干的人把头、脚、手拼接到自己的躯干上,因此一个机器人便造出来了

class Course:
    def __init__(self, name, period, price):
        self.name = name
        self.period = period
        self.price = price

class OldboyPeople:
    school = 'oldboy'

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

class OldboyStudent(OldboyPeople):
    def __init__(self, name, age, sex, stu_id):
        OldboyPeople.__init__(self, name, age, sex)
        self.stu_id = stu_id

    def choose_course(self):
        print('%s is choosing course' % self.name)

class OldboyTeacher(OldboyPeople):
    def __init__(self, name, age, sex, level):
        OldboyPeople.__init__(self, name, age, sex)
        self.level = level

    def score(self, stu, num):
        stu.score = num
        print('老师[%s]为学生[%s]打分[%s]' % (self.name, stu.name, num))

# 创造课程
python = Course('python全栈开发', '5mons', 3000)
linux = Course('linux运维', '5mons', 800)

# 创造学生与老师
stu1 = OldboyStudent('tank', 19, 'male', 1)
tea1 = OldboyTeacher('nick', 18, 'male', 10)

# 组合
# 将学生、老师与课程对象关联/组合
stu1.course = python
tea1.course = linux

四、多父类继承问题

Python同样有限的支持多继承形式。多继承的类定义形如下例:

class DerivedClassName(Base1, Base2, Base3):

    .
    .
    .

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 。即方法在子类中未找到时,从左到右查找父类中是否包含方法。

1、新式类(MRO)列表

  • 继承了object的类以及该类的子类,都是新式类
  • Python3中所有的类都是新式类
  • 广度优先, 老祖宗最后找。
class G(object):
    # def test(self):
    #     print('from G')
    pass

class E(G):
    # def test(self):
    #     print('from E')
    pass

class B(E):
    # def test(self):
    #     print('from B')
    pass

class F(G):
    # def test(self):
    #     print('from F')
    pass

class C(F):
    # def test(self):
    #     print('from C')
    pass

class D(G):
    # def test(self):
    #     print('from D')
    pass

class A(B, C, D):
    def test(self):
        print('from A')

obj = A()
obj.test()  # A->B->E-C-F-D->G-object
# from A

python计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,来实现继承的。

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。而这个MRO列表的构造是通过一个C3线性化算法来实现的。

print(A.mro())  # A.__mro__
# [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>]

for i in A.mro():
    print(i)

# <class '__main__.A'>
# <class '__main__.B'>
# <class '__main__.E'>
# <class '__main__.C'>
# <class '__main__.F'>
# <class '__main__.D'>
# <class '__main__.G'>
# <class 'object'>

2、super()方法详解

super() 函数是用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

下面的例子可以看到:

  • 每个类开始调用是根据MRO顺序进行开始,然后逐个进行结束的。
  • 由于因为需要继承不同的父类,参数不一定,所有的父类都应该加上不定参数*args , **kwargs ,不然参数不对应是会报错的。
# 胖子老板的父类
class FatFather(object):
    def __init__(self, name, *args, **kwargs):
        print()
        print("=============== 开始调用 FatFather  ========================")
        print('FatFather的init开始被调用')
        self.name = name
        print('调用FatFather类的name是%s' % self.name)
        print('FatFather的init调用结束')
        print()
        print("=============== 结束调用 FatFather  ========================")

# 胖子老板类 继承 FatFather 类
class FatBoss(FatFather):
    def __init__(self, name, hobby, *args, **kwargs):
        print()
        print("=============== 开始调用 FatBoss  ========================")
        print('胖子老板的类被调用啦!')
        # super().__init__(name)
        # 因为多继承传递的参数不一致,所以使用不定参数
        super().__init__(name, *args, **kwargs)
        print("%s 的爱好是 %s" % (name, hobby))
        print()
        print("=============== 结束调用 FatBoss  ========================")

# 胖子老板的老婆类 继承 FatFather类
class FatBossWife(FatFather):
    def __init__(self, name, housework, *args, **kwargs):
        print()
        print("=============== 开始调用 FatBossWife  ========================")
        print('胖子老板的老婆类被调用啦!要学会干家务')
        # super().__init__(name)
        # 因为多继承传递的参数不一致,所以使用不定参数
        super().__init__(name, *args, **kwargs)
        print("%s 需要干的家务是 %s" % (name, housework))
        print()
        print("=============== 结束调用 FatBossWife  ========================")

# 胖子老板的女儿类 继承 FatBoss FatBossWife类
class FatBossGril(FatBoss, FatBossWife):
    def __init__(self, name, a, b):
print('胖子老板的女儿类被调用啦!要学会干家务,还要会帮胖子老板斗地主')
        super().__init__(name, a, b)

def main():
    print("打印FatBossGril类的MRO")
    print(FatBossGril.__mro__)
    # (<class '__main__.FatBossGril'>, <class '__main__.FatBoss'>, <class '__main__.FatBossWife'>, <class '__main__.FatFather'>, <class 'object'>)
    print("=========== 下面按照 MRO 顺序执行super方法 =============")
    gril = FatBossGril("胖子老板", "打斗地主", "拖地")

if __name__ == "__main__":
    main()

# =========== 下面按照 MRO 顺序执行super方法 =============
# 胖子老板的女儿类被调用啦!要学会干家务,还要会帮胖子老板斗地主
#
# =============== 开始调用 FatBoss  ========================
# 胖子老板的类被调用啦!
#
# =============== 开始调用 FatBossWife  ========================
# 胖子老板的老婆类被调用啦!要学会干家务
#
# =============== 开始调用 FatFather  ========================
# FatFather的init开始被调用
# 调用FatFather类的name是胖子老板
# FatFather的init调用结束
#
# =============== 结束调用 FatFather  ========================
# 胖子老板 需要干的家务是 拖地
#
# =============== 结束调用 FatBossWife  ========================
# 胖子老板 的爱好是 打斗地主
#
# =============== 结束调用 FatBoss  ========================

五、抽象类

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)

import abc

class Animal(metaclass=abc.ABCMeta):  # 同一类事物:动物
    @abc.abstractmethod  # 上述代码子类是约定俗称的实现这个方法,加上@abc.abstractmethod装饰器后严格控制子类必须实现这个方法
    def talk(self):
        raise AttributeError('子类必须实现这个方法')

class People(Animal):  # 动物的形态之一:人
    def talk(self):
        print('say hello')

class Dog(Animal):  # 动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal):  # 动物的形态之三:猪
    def talk(self):
        print('say aoao')

peo2 = People()
pig2 = Pig()
d2 = Dog()

peo2.talk()
pig2.talk()
d2.talk()

# say hello
# say aoao
# say wangwang

六、类的封装

类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。

1、私有属性:双下划线的方式__x

在python中用双下划线的方式__x实现隐藏属性(设置成私有的),我们需要在类中定义一个函数(接口函数)在它内部访问被隐藏的属性,然后外部就可以使用了。

class Site:
    def __init__(self, name, url):
        self.name = name       # public
        self.__url = url   # private

    def who(self):
        print('name  : ', self.name)
        print('url : ', self.__url)

    def __foo(self):          # 私有方法
        print('这是私有方法')

    def foo(self):            # 公共方法
        print('这是公共方法')
        self.__foo()

x = Site('菜鸟教程', 'www.runoob.com')
x.who()        # 正常输出
x.foo()        # 正常输出
x.__foo()      # 报错

2、外部使用变形访问:_类名__x

类中所有双下划线开头的名称如__x都会自动变形成: _类名__x的形式:

这种自动变形的特点:

  • 类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果。
  • 这种变形其实正是针对内部的变形,在外部是无法通过__x这个名字访问到的。
  • 在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N。

class A:
    __N = 0  # 把类的数据属性设置成私有的如__N,会变形为_A__N

    def __init__(self):
        self.__X = 10  # 变形为self._A__X

    def __foo(self):  # 变形为_A__foo
        print('from A')

    def bar(self):
        self.__foo()  # 只有在类内部才可以通过__foo的形式访问到.

# 对象测试
a = A()
print(a._A__N)  # 0
print(a._A__X)  # 10

# 类测试
print(A._A__N)  # 0
print(A._A__X)  # 对象私有的属性# type object 'A' has no attribute '_A__X'

注意:变形的过程只在类的定义时发生一次,在定义后的赋值操作,不会变形。

a = A()
print(a.__dict__)  # {'_A__X': 10}

a.__Y = 1
print(a.__dict__)  # {'_A__X': 10, '__Y': 1}

3、在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

# 正常情况
class A:
    def fa(self):
        print('from A')

    def test(self):
        self.fa()

class B(A):
    def fa(self):
        print('from B')

b = B()
b.test()  # from B

# 把fa定义成私有的,即__fa
class A:
    def __fa(self):  # 在定义时就变形为_A__fa
        print('from A')

    def test(self):
        self.__fa()  # 只会与自己所在的类为准,即调用_A__fa

class B(A):
    def __fa(self): #子类无法覆盖
        print('from B')

b = B()
b.test()  # from A

python模块也遵循这种约定,如果模块中的变量名_amodule以单下划线开头,那么from module import *时不能被导入该变量,但是你from module import_amodule依然是可以导入该变量的。

如果遇到下划线开头的(socket._socket,sys._home,sys._clear_type_cache),这些都是私有的,原则上是供内部调用的,作为外部也是可以用的。严格控制属性的访问权限,只能借助内置方法如__getattr__。

七、类的属性(property)

1、装饰器方式 (推荐使用)

property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用。

  • 1. 定义时,在实例方法的基础上添加 @property 装饰器,并且仅有一个self参数
  • 2. 调用时,无需括号

property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。

分页的功能包括:

  • 根据用户请求的当前页和总数据条数计算出 m 和 n
  • 根据m 和 n 去数据库中请求数据
class Pager:
    def __init__(self, current_page):
        # 用户当前请求的页码(第一页、第二页...)
        self.current_page = current_page
        # 每页默认显示10条数据
        self.per_items = 10

    @property
    def start(self):
        val = (self.current_page - 1) * self.per_items
        return val

    @property
    def end(self):
        val = self.current_page * self.per_items
        return val

# ############### 调用 ###############
p = Pager(2)
print(p.start)  # 就是起始值,即:m
# 10

print(p.end)  # 就是结束值,即:n
# 20

2、经典类和新式类的属性方式:

  • 经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法。
  • 新式类(如果类继object,那么该类是新式类 )中的属性有三种访问方式,并分别对应了三个被 @property、@方法名.setter、@方法名.deleter 修饰的方法,对同一个属性:获取、修改、删除
class Goods(object):
    def __init__(self):
        # 原价
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    @property
    def price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter
    def price(self, value):
        self.original_price = value

    @price.deleter
    def price(self):
        print('del')
        del self.original_price

obj = Goods()
print(obj.price)  # 获取商品价格
# 80.0

obj.price = 200  # 修改商品原价
print(obj.price)
# 160.0

del obj.price  # 删除商品原价
# del

3、类属性方式

注意:当使用类属性的方式创建property属性时,经典类和新式类无区别。

property方法中有个四个参数

  • 第一个参数是调用 对象.属性 时自动触发执行方法
  • 第二个参数是调用 对象.属性 = XXX 时自动触发执行方法
  • 第三个参数是调用 del 对象.属性 时自动触发执行方法
  • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
class Goods(object):
    def __init__(self):
        # 原价
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    def get_price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    def set_price(self, value):
        self.original_price = value

    def del_price(self):
        del self.original_price

    PRICE = property(get_price, set_price, del_price, '价格属性描述...')

obj = Goods()
print(obj.PRICE)  # 获取商品价格
# 80.0

obj.PRICE = 200  # 修改商品原价
print(obj.PRICE)
# 160.0

del obj.PRICE  # 删除商品原价

3、实例

实现一个属性的设置和读取方法,可做边界判定

class Money(object):
    def __init__(self):
        self.__money = 0

    # 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性,当调用获取money的值时,调用装饰的方法
    @property
    def money(self):
        return self.__money

    # 使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法
    @money.setter
    def money(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型数字")

a = Money()
a.money = 100
print(a.money)# 100

八、实例方法及非绑定实例方法

1、实例方法

在类中没有被任何装饰器修饰的方法就是绑定到对象的实例方法,这类方法专门为对象定制。

class Person:
    country = "China"

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

    def speak(self):
        print(self.name + ', ' + str(self.age))

p = Person('Kitty', 18)
print(p.__dict__)
# {'name': 'Kitty', 'age': 18}

print(Person.__dict__['speak'])
#

speak即为绑定到对象的方法,这个方法不在对象的名称空间中,而是在类的名称空间中。

绑定到对象的方法:

  • 通过对象调用,会有一个自动传值的过程,即自动将当前对象传递给方法的第一个参数(self,一般都叫self,也可以写成别的名称);
  • 使用类调用,则第一个参数需要手动传值。
p = Person('Kitty', 18)
p.speak()  # 通过对象调用
# Kitty, 18

Person.speak(p)  # 通过类调用
# Kitty, 18

2、类方法(@classmethod )

类中使用 @classmethod 修饰的方法就是绑定到类的方法。这类方法专门为类定制。

  • 通过类名调用绑定到类的方法时,会将类本身当做参数传给类方法的第一个参数。类方法默认有个 cls 参数。
  • 通过对象也可以调用,只是默认传递的第一个参数还是这个对象对应的类。
class Operate_database():
    host = '192.168.0.5'
    port = '3306'
    user = 'abc'
    password = '123456'

    @classmethod
    def connect(cls):  # 约定俗成第一个参数名为cls,也可以定义为其他参数名
        print(cls)
        print(cls.host + ':' + cls.port + ' ' + cls.user + '/' + cls.password)

Operate_database.connect()
# <class '__main__.Operate_database'>
# 192.168.0.5:3306 abc/123456

Operate_database().connect()  # 输出结果一致
# <class '__main__.Operate_database'>
# 192.168.0.5:3306 abc/123456

3、静态方法(@staticmethod )

在类内部使用 @staticmethod 修饰的方法即为非绑定的静态方法,这类方法和普通定义的函数没有区别,不与类或对象绑定,谁都可以调用,且没有自动传值的效果。

import hashlib

class Operate_database():
    def __init__(self, host, port, user, password):
        self.host = host
        self.port = port
        self.user = user
        self.password = password

    @staticmethod
    def get_passwrod(salt, password):
        m = hashlib.md5(salt.encode('utf-8'))  # 加盐处理
        m.update(password.encode('utf-8'))
        return m.hexdigest()

hash_password = Operate_database.get_passwrod('lala', '123456')  # 通过类来调用
print(hash_password)
# f7a1cc409ed6f51058c2b4a94a7e1956

p = Operate_database('192.168.0.5', '3306', 'abc', '123456')
hash_password = p.get_passwrod(p.user, p.password)  # 也可以通过对象调用
print(hash_password)
# 0659c7992e268962384eb17fafe88364

九、类的专有方法:

  • __init__ : 构造函数,在生成对象时调用
  • __del__ : 析构函数,释放对象时使用
  • __repr__ : 打印,转换
  • __setitem__ : 按照索引赋值
  • __getitem__: 按照索引获取值
  • __len__: 获得长度
  • __cmp__: 比较运算
  • __call__: 函数调用
  • __name__:模块名称,一段程序作为主线运行程序时其内置名称就是 __main__

运算符重载

  • __add__: 加运算
  • __sub__: 减运算
  • __mul__: 乘运算
  • __truediv__: 除运算
  • __mod__: 求余运算
  • __pow__: 乘方

对类的专有方法进行重载实例如下:

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)

   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)

#Vector(7,8)

到此这篇关于Python面向对象编程的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python 面向对象编程的三大特性之继承

    目录 Python  面向对象编程的三大特性之继承 一.继承 1.继承的实际栗子 2.继承的好处 3.继承的使用场景 4.继承有几种? 5.Python 中继承的简单语法 二.不使用继承.使用继承的区别 1.需求背景 2.不使用继承 2.使用继承 三.继承的传递性 1.什么是传递性 四.继承和抽象 1.继承的重点 Python  面向对象编程的三大特性之继承 一.继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的

  • Python学习之面向对象编程详解

    目录 什么是面向对象编程(类) 类的关键字-class 类的定义与使用 类的参数-self self的解析与总结 类的构造函数 构造函数的创建方法 关于对象的生命周期 什么是面向对象编程(类) 利用(面向)对象的(属性和方法)去进行编码的过程即面向对象编程 自定义对象数据类型就是面向对象中的类(class)的概念 类的关键字 - class class 关键字用来声明类,类的名称首字母大写,多单词的情况下每个单词首字母大写(即驼峰命名法).在我们一开始学习 Python 的时候说过,要尽量避免使

  • 浅析Python面向对象编程

    概述 很多人接触Python,都是从爬虫开始,其实很多语言都可以做爬虫,只是Python相对其他语言来说,更加简单而已.但是Python并不止于爬虫,在人工智能,科学计算等方面的应用更加广泛.古人云:万丈高楼平地起,要想有长足的发展,打好基础很重要,本文主要讲解Python的面向对象相关知识,仅供学习分享使用,如有不足之处,还请指正. 面向对象的特征 类:用来描述相同事物的特征的集合,如:Person 类,表示人,具有人的属性和特征. 对象:通过类定义的具体的实例,如:zhangsan 表示一个

  • Python面向对象编程(一)

    目录 一.程序中定义类和对象 1. 定义类 2. 定义对象 二.定制对象独有特征 1.引入 2.定制对象独有特征 3.对象属性查找顺序 4.类定义阶段定制属性 三.对象的绑定方法 1.类使用对象的绑定对象 2.对象使用对象的绑定方法 四.类与数据类型 Python面向对象编程(一) Python面向对象编程(二) Python面向对象编程(三) 和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制. Python中的类提供了面向对象编程的所有基本功能:类的继承机制允

  • Python面向对象编程(三)

    目录 一.isinstance和issubclass 二.反射(hasattr和getattr和setattr和delattr) 1.反射在类中的使用 2.反射在模块中的使用 3.实例:基于反射机制模拟web框架路由 三.__getattr__.__setattr__和__delattr__和__getattribute__事件 __getattribute__ 四.__setitem__和__getitem和__delitem__ 五.__format__:自定制格式化字符串 六.__del_

  • Python面向对象编程(二)

    目录 一.对象的继承 1.类的构造函数继承__init__(): 2.继承关系中,对象查找属性的顺序 二.类的派生 1.派生方法一(类调用) 2.派生方法二(super) 三.类的组合 四.多父类继承问题 1.新式类(MRO)列表 2.super()方法详解 五.抽象类 六.类的封装 1.私有属性:双下划线的方式__x 2.外部使用变形访问:_类名__x 3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的 七.类的属性(property) 1.装饰器方式 (推荐使用) 2.经

  • Python面向对象编程基础解析(二)

    Python最近挺火呀,比鹿晗薛之谦还要火,当然是在程序员之间.下面我们看看有关Python的相关内容. 上一篇文章我们已经介绍了部分Python面向对象编程基础的知识,大家可以参阅:Python面向对象编程基础解析(一),接下来,我们看看另一篇. 封装 1.为什么要封装? 封装就是要把数据属性和方法的具体实现细节隐藏起来,只提供一个接口.封装可以不用关心对象是如何构建的,其实在面向对象中,封装其实是最考验水平的 2.封装包括数据的封装和函数的封装,数据的封装是为了保护隐私,函数的封装是为了隔离

  • Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向对象与面向过程的区别 我们之前已经介绍过面向过程了,面向过程的核心在'过程'二字,过程就是解决问题的步骤,面向过程的方法设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题简单化,流程化 缺点:扩展性差 主要应用场景有:Linux内核,git,以及http服务 面向对象的程序设计

  • Python面向对象编程之类的运算

    目录 1.运算概念的理解 2.运算符的重载 2.1 算术运算符 2.2 比较运算符 2.3 成员运算 2.4 其他运算 3.Python类的多态 1.运算概念的理解 运算(Operation)是操作逻辑的抽象 运算体现一种操作逻辑,在广义角度来说任何程序都是一种运算 Python解释器通过保留方法预留了一批运算的接口,需要重载 保留方法一般对应运算符,Python中运算体现为运算符的重载 运算本质上体现了交互关系.包含关系和常规的操作关系 运算重载的限制 不能重载Python语言内置类型的运算符

  • Python面向对象编程中的类和对象学习教程

    Python中一切都是对象.类提供了创建新类型对象的机制.这篇教程中,我们不谈类和面向对象的基本知识,而专注在更好地理解Python面向对象编程上.假设我们使用新风格的python类,它们继承自object父类. 定义类 class 语句可以定义一系列的属性.变量.方法,他们被该类的实例对象所共享.下面给出一个简单类定义: class Account(object): num_accounts = 0 def __init__(self, name, balance): self.name =

  • 关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们就来了解关于Python面向对象编程的知识点吧. 类与实例 类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息. 类.属性和方法命名规范 类名通常由大写字母打头.这是标准惯例,可以帮助你识别类,特别是在实例化过程中(有时看起来像函数调用).还有,数据属性(变量或常量

  • 详解Python:面向对象编程

    面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度 python和java都是面向对象的语言.面向对象编程的特点数据封装.继承和多态 1.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. 在pyth

随机推荐