python理论加强(二)

命令行参数

命令行参数格式为

python my.py v1 v2 

可以通过以下查看参数的值,需要注意的是,argv[0]指的是脚本自身路径,argv[1]才为第一个参数V1

from sys import argv 

继承

子类只继承父类非私有方法,要想使用父类属性,需要调用父类init方法,但当继承关系为菱形继承时,会出现父类初始化多次的问题,这叫做二义性问题

为了解决这种问题,使用super关键字来调用父类init方法

  • suoer关键字的作用:

    super().__init__相对于类名.__init__,在单继承上用法基本无差

    但是在多继承中,如下图菱形继承,super不会重复初始化父类,他是利用类的MOR顺序调用当前类在MOR顺序中的下一个类
    在这里插入图片描述

  • MOR规则

    mor是能把多继承的层次关系转换为线性结构的一种规则,底层基于c3算法。子类优先,先继承优先。如上图,A是B,C的父类,B,C是D的父类,所以优先顺序是D,BC,A,由于在定义D类时,D类先继承B类在继承C类,所以最后顺序为DBCA

  • 多继承传参问题

    在多继承中,初始化子类对象时,子类对象要把父类需要的参数全部传递进去,如果参数容易引起混乱,指定关键字传参即可

property

一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法

  • 平时我们是这样调用私有属性的
class People():
    def __init__(self,name):
        self.__name=name
    def get_name(self):
        return self.__name
    def set_name(self,name):
        self.__name=name
    def del_name(self):
        del self.__name

people=People("xzp")
print(people.get_name())
people.set_name("ldd")
print(people.get_name())

当我们用property时可以向平时调用普通属性那样,property自动为我们做了封装

  • property有2种方法可以简化这种操作方法一

    • 方法一
    class Goods(object):
    
        def __init__(self):
            self.__price=100
    
        def get_price(self):
            return self.__price
    
        def set_price(self, value):
            self.__price=value
    
        def del_price(self):
            del self.__price
    
        price=property(get_price,set_price,del_price,"price")
    
    good=Goods()
    print(good.price)
    good.price=200
    print(good.price)
    
    • 方法二
    class Goods(object):
    
        def __init__(self):
            self.__price=100
    	
        @property
        def get_price(self):
            return self.__price
    	@property.setter
        def set_price(self, value):
            self.__price=value
    	@property.deleter
        def del_price(self):
            del self.__price
    
    good=Goods()
    print(good.price)
    good.price=200
    print(good.price)
    

魔法属性和方法

__doc__

  • 表示类的描述信息
class Foo:
    """ 描述类信息,这是用于看片的神奇 """
    def func(self):
        pass

print(Foo.__doc__)
#输出:类的描述信息

__module__ 和 __class__

  • module 表示当前操作的对象在那个模块
  • class 表示当前操作的对象的类是什么

test.py

# -*- coding:utf-8 -*-

class Person(object):
    def __init__(self):
        self.name = 'laowang'

main.py

from test import Person

obj = Person()
print(obj.__module__)  # 输出 test 即:输出模块
print(obj.__class__)  # 输出 test.Person 即:输出类

__init__

  • 初始化方法,通过类创建对象时,自动触发执行
class Person:
    def __init__(self, name):
        self.name = name
        self.age = 18


obj = Person('laowang')  # 自动执行类中的 __init__ 方法

__del__

  • 当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:
    def __del__(self):
        pass

__call__

  • 对象后面加括号,触发执行。

注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

__dict__

  • 类或对象中的所有属性

类的实例属性属于对象;类中的类属性和方法等属于类,即:

class Province(object):
    country = 'China'

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

    def func(self, *args, **kwargs):
        print('func')

# 获取类的属性,即:类属性、方法、
print(Province.__dict__)
# 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}

obj1 = Province('山东', 10000)
print(obj1.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 10000, 'name': '山东'}

obj2 = Province('山西', 20000)
print(obj2.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 20000, 'name': '山西'}

__str__

  • 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
class Foo:
    def __str__(self):
        return 'laotie'


obj = Foo()
print(obj)
# 输出:laotie

__getitem__、__setitem__、__delitem__

  • 用于索引操作,如字典。以上分别表示获取、设置、删除数据
# -*- coding:utf-8 -*-

class Foo(object):

    def __getitem__(self, key):
        print('__getitem__', key)

    def __setitem__(self, key, value):
        print('__setitem__', key, value)

    def __delitem__(self, key):
        print('__delitem__', key)


obj = Foo()

result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'laotie'    # 自动触发执行 __setitem__
del obj['k1']           # 自动触发执行 __delitem__

上下文管理器

with open("output.txt", "r") as f:
        f.write("Python之禅")

上下文管理器本质就是能够支持with操作。

任何实现了 enter() 和 exit() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器协议。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 是一种高级、解释型、通用的编程语言,以其简洁的语法和丰富的库而受到开发者喜爱。它的理论基础主要包括以下几个关键点: 1. **动态类型系统**:Python 是动态类型语言,不需要在声明变量时指定其数据类型,变量的类型会在运行时自动确定。 2. **解释执行**:Python 代码不是编译成机器语言,而是逐行解释执行,这使得它具有更高的可读性和灵活性。 3. **面向对象编程(OOP)**:Python 支持封装、继承和多态等 OOP 原则。类和对象是其核心概念,通过定义类来创建对象,并通过方法(函数)来操作这些对象。 4. **函数式编程特性**:Python 提供了高阶函数、匿名函数(lambda表达式)、以及列表推导等特性,支持函数作为一等公民。 5. **模块和包管理**:Python 通过 `import` 关键字来组织和复用代码,使用 `pip` 进行包管理,如安装第三方库。 6. **异常处理**:Python 使用 try/except 块来捕获和处理程序运行时可能出现的错误,保证代码的健壮性。 7. **元编程**:Python 允许程序员在运行时修改或扩展代码的行为,提供内建的元类功能。 8. **迭代器和生成器**:Python 强调序列操作的高效性,提供了迭代器和生成器的概念,用于处理大量数据。 9. **装饰器**:这是一种特殊类型的函数,用于修改其他函数的功能,增强了代码的灵活性和可复用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值