了解python之面向对象

2023-05-16

了解python之面向对象

面向对象概念:

面向对象编程(Object Oriented Programming,简称OOP)是一种程序涉及思想。OOP把对象作为程序的基本单元,一个对象包含数据和操作数据的函数。面向对象程序设计把计算机程序视为一组对象的集合,每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间的传递。

在python中,所有数据类型都被视为对象,也可以自定义对象。自定义对象数据类型就是面向对象中的类(Class)的概念。

 

面向对象术语介绍:

  • 类:用来描述具有相同属性和方法的对象的集合。类定义了集合中每个对象共有的属性和方法。对象是类的实例。
  • 类变量(属性):类变量在整个实例化的对象中是公用的,类变量定义在类中,且在方法之外,类变量通常不作为实例变量使用。类变量也称为属性。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,就可以对其进行改写,这个过程称为方法的覆盖,也称为方法的重写
  • 实例变量:定义在方法中的变量只作用于当前实例的类。
  • 多态:对不同类的对象使用同样的操作。
  • 封装:对外部世界隐藏对象的工作细节。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承允许把一个派生类的对象作为一个基类对象对待,以普通类为基础建立专门的类对象。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)和方法。

python中的类提供了面向对象编程的所有基本功能;类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法、方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。

 

类的定义与使用

1)类的定义:

class MyCLass(object):
  i=123
  def f(self):
     return 'hello world'

从面可以看到类的语法如下:

class ClassName(object):
  <statement-1>
  ...
  <statement-N>

 python中定义类使用class关键词,class后面接类的名字,如上面例子中的MyClass,类的名字通常是大写开头的单词;紧接着是(object),表示MyClass这个类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。类包含属性(相当于函数中的语句)和方法(类中的函数)。

 

2)类的使用

class MyClass(object):
    i=123
    def f(self):
       return 'hello world'
use_class=MyClass()   #类的实例化。即创建一个类的实例,use_class变量称为类的具体对象
print('调用类的属性:',use_class.i)   #调用类的属性,就是前面我们说的类变量
print('调用类的方法:',use_class.f())  #调用类的方法

##输出结果:
调用类的属性: 123
调用类的方法: hello world

上面定义的f()函数可以不用self参数吗?

在类定义方法的要求:在类中定义方法时,第一个参数必须是self。除了第一个参数外,类的方法和普通函数没有区别,可以使用默认参数,可变参数,关键字参数等。

类中调用方法的要求:要调用方法,在实例变量上直接调用即可。除了self不用传递参数,其他参数正常传入。

类对象支持两种操作,即属性引用和实例化。

属性引用的标准语法:

obj.name  # obj代表类对象,name代表属性

深入类

1)类的构造方法

class MyClass(object):
    i=123
    def __init__(self,name):
        self.name=name
    def f(self):
       return 'hello world'

use_class=MyClass('lucky')           #类的实例化。即创建一个类的实例,use_class变量称为类的具体对象
print('调用类的属性:',use_class.i)     #调用类的属性,就是前面我们说的类变量
print('调用类的方法:',use_class.f())  #调用类的方法

##输出结果:
调用类的属性: 123
调用类的方法: hello world

在python中,__init__()方法是一个特殊的方法,在对象实例化时会被调用。__init__()意思是初始化,是initialization的简写。这个方法的书写方式:先输入两个下划线,后面接init,再接着两个下划线。这个方法叫做构造函数。在定义类的时候,若不显示的定义一个__init__()方法,则程序默认会调用一个无参的__init__()方法。

 

比方说下面的代码:

class DefaultInit(object):
    def __init__(self):
        print('在类实例化时执行我,我是__init__方法')
    def show(self):
        print('我是类中定义的方法,需要通过实例化对象调用')

test=DefaultInit()
print('类实例化结束')
test.show()

##输出结果:
在类实例化时执行我,我是__init__方法
类实例化结束
我是类中定义的方法,需要通过实例化对象调用


/

class DefaultInit(object):
    def show(self):
        print('我是类中定义的方法,需要通过实例化对象调用')

test=DefaultInit()
print('类实例化结束')
test.show()

##输出结果:
类实例化结束
我是类中定义的方法,需要通过实例化对象调用

通过上面两段代码可以得出:
在代码中定义了init()方法时,实例化类时会调用该方法;若没有定义init()方法,实例化类时也不会报错,此时调用默认的__init__()方法。在python中定义类时,若没有定义构造方法(__init__()),则在类实例化时系统调用默认的构造方法。另外,__init__()方法可以有参数,参数通过__init__()传递到类的实例化操作上。

 

2)可以在一个类中定义多个构造方法吗?

class DefaultInit(object):
    def __init__(self):
        print('我是不带参数的init方法')

test=DefaultInit()
print('类实例化结束')

##输出结果:
我是不带参数的init方法
类实例化结束


//

class DefaultInit(object):
    def __init__(self):
        print('我是不带参数的init方法')
    def __init__(self,name):
        print('我是带参数的init方法,参数值是:',name)

test=DefaultInit('hello')
print('类实例化结束')

##输出结果:
我是带参数的init方法,参数值是: hello
类实例化结束


/
class DefaultInit(object):
    def __init__(self, name):
        print('我是带参数的init方法,参数值是:', name)
    def __init__(self):
        print('我是不带参数的init方法')

test=DefaultInit()
print('类实例化结束')

##输出结果:
我是不带参数的init方法
类实例化结束

在一个类中可以定义多个构造方法,但是实例化类时只实例化最后的构造方法,即后面的构造方法会覆盖前面的构造方法,并需要根据最后一个构造方法的形式进行实例化。建议一个类中只定义一个构造方法。

类的访问权限

在类的内部有属性和方法,外部代码可以直接通过调用实例变量的方法操作数据,这样就隐藏了内部的复杂逻辑。

例如:

class Student(object):
    def __init__(self,name,score):
        self.name=name
        self.score=score
    def info(self):
        print('学生: %s; 分数: %s' % (self.name,self.score))

stu=Student('lucky',96)
print('修改前的分数:',stu.score)
stu.info()
stu.score=0
print('修改后的分数:',stu.score)
stu.info()


##输出结果:
修改前的分数: 96
学生: lucky; 分数: 96
修改后的分数: 0
学生: lucky; 分数: 0

类中定义的非构造方法可以调用类中的构造方法实例变量的属性,调用的方式为self.实例变量属性名,如代码中self.name和self.score。可以在类的外部修改类的内部属性。

 

如果要让类的内部属性不被外部访问,怎么办?

要让内部的属性不被外部访问,可以在属性名称前加两个下划线__。在python,如果实例的变量名以__开头,就会变成私有变量,只有内部可以访问,外部不能访问。对上面的代码修改:

class Student(object):
    def __init__(self,name,score):
        self.__name=name
        self.__score=score
    def info(self):
        print('学生: %s; 分数: %s' % (self.__name,self.__score))

stu=Student('lucky',96)
print('修改前的分数:',stu.__score)
stu.info()
stu.__score=0
print('修改后的分数:',stu.__score)
stu.info()

##输出结果:
AttributeError: 'Student' object has no attribute '__score'

把类的中的变量变成私有变量有什么用呢?
可以确保外部的代码不能随意修改对象内部的状态,通过访问限制的保护,代码更加安全。比如上面分数是一个比较重要的对象,是不允许在程序外随意的修改的。


如果外部的代码想要获取类中的name和score怎么办?
在python中可以增加get_attrs()方法,获取类中私有变量,可以在上面的例子条件一个get_score方法,如下:

class Student(object):
    def __init__(self,name,score):
        self.__name=name
        self.__score=score
    
   def info(self):
        print('学生: %s; 分数: %s' % (self.__name,self.__score))

    def get_score(self):        #在类外部可以得到类内部的私有变量
        return self.__score

    def set_score(self,score):
        self.__score=score

stu=Student('lucky',96)
print('修改前的分数:',stu.get_score())
stu.info()
stu.set_score(0)                #在类的外部修改私有变量
print('修改后的分数:',stu.get_score())
stu.info()

##输出结果:
修改前的分数: 96
学生: lucky; 分数: 96
修改后的分数: 0
学生: lucky; 分数: 0

类的私有方法

私有方法调用的方式:
self.__private_methods

class PrivatePublicMethod(object):
    def __init__(self):
        pass

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

    def foo(self):     #公共方法
        print('这是公共方法')
        print('公共方法中调用私有方法')
        self.__foo()
        print('公共方法调用私有方法结束')

pri_pub=PrivatePublicMethod()
print('开始调用公共方法:')
pri_pub.foo()
print('开始调用私有方法:')
pri_pub.__foo()

##输出结果:
AttributeError: 'PrivatePublicMethod' object has no attribute '__foo'
开始调用公共方法:
这是公共方法
公共方法中调用私有方法
这是私有方法
公共方法调用私有方法结束
开始调用私有方法:

上面代码在调用私有方法时候, 报错。 注意:私有方法和私有变量类似,不能在类外部被调用。

 

类的继承

面向对象编程带来的好吃之一就是代码的重用,实现重用的方法之一是通过继承机制。继承可以理解成类之间类型和子类型的关系。

在面向对象程序设计中,当我们定义一个class时,可以从某个现有的class继承,定义的新的class称为子类(Subclass),而被继承的class称为基类、父类或者超类(Base Class、Super Class)

 

继承的定义如下:


class DerivedClassName(BaseClassName):
  <statement-1>
  ...
  <statement-2>


需要注意的是,继承语法 class 子类名(基类名) 时,  #基类名写在括号里,基本类是在定义类的时候,在元组中指明的。

在python中,继承有以下特点:
1)在继承中,基类的构造方法(__init__)不会被自动调用,需要在子类的构造方法中专门调用。
2)在调用基类的方法时,需要加上基类的类名前缀,并带上self参数变量。区别在于类中调用普通函数时不需要带self参数。
3)在python中,首先查找对应类型的方法,如果在子类中找不到对应的方法,才到基类中逐个查找。

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    pass

class Cat(Animal):
    pass

dog=Dog()
dog.run()

cat=Cat()
cat.run()

##输出结果:
Animal is running...
Animal is running...

继承有什么好处?
继承最大的好处是子类获得了父类全部非私有的功能。由于在Animal中定义了run()非私有的方法,作为Animal的子类,Dog和Cat什么方法都没有定义,自动拥有Animal这个基类中的run()方法。

 

子类中可以拥有自己的方法:

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def eat(self):
        print('Eating...')

class Cat(Animal):
    pass

dog=Dog()
dog.run()
dog.eat()

##输出结果:
Animal is running...
Eating...

从结果可以看到,既执行了父类的方法,又执行了自己定义的方法。

 

子类不能继承父类的私有方法,也不能调用父类的私有方法,父类的定义如下:

class Animal(object):
    def run(self):
        print('Animal is running...')
    def __run(self):
        print('I am a private method..')

class Dog(Animal):
    def eat(self):
        print('Eating...')

dog=Dog()
dog.run()
dog.eat()
dog.__run()

##输出结果:
Animal is running...
Eating...
AttributeError: 'Dog' object has no attribute '__run'

从结果可以看到,子类不能调用父类的私有方法,子类虽然继承了父类,但是调用父类的私有方法相当于从外部调用类中的方法,因此调用不成功。

对于父类中扩展的非私有方法,子类可以拿来即用,如在父类Animal增加一个jump方法:

class Animal(object):
    def run(self):
        print('Animal is running...')
    def jump(self):
        print('Animal is jumping..')

class Dog(Animal):
    def eat(self):
        print('Eating...')

dog=Dog()
dog.run()
dog.jump()
dog.eat()

##输出结果:
Animal is running...
Animal is jumping..
Eating...

继承可以一级一级继承下来,所有类最终都可以追朔到根类object。

 

类的多态

当子类和基类存在相同的run方法的时候,子类的run方法会覆盖基类的run方法。在代码运行时总会调用子类的run()方法,称之为多态。

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def eat(self):
        print('Eating...')

class Cat(Animal):
    pass

dog=Dog()
dog.run()

cat=Cat()
cat.run()

##输出结果:
Animal is running...
Animal is running...
class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def run(self):
        print('Dog is running...')

class Cat(Animal):
    def run(self):
        print('Cat is running...')

dog=Dog()
dog.run()

cat=Cat()
cat.run()

##输出内容:
Dog is running...
Cat is running...

 

当我们定义一个类的时候,实际上就定义了一种数据类型,自定义的数据类型和python自带的数据类型(字符串、列表、元组、字典等)没什么区别。

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def run(self):
        print('Dog is running...')

class Cat(Animal):
    def run(self):
        print('Cat is running...')

dog=Dog()
dog.run()

cat=Cat()
cat.run()

a=list()   #变量a是list类型
b=Animal()  #变量b是Animal
c=Dog()     #c是Dog类型

print('a是否是list类型:',isinstance(a,list))     #isinstance()方法判断一个变量是否是某个类型
print('b是否是Animal类型:',isinstance(b,Animal))
print('c是否是Dog类型:',isinstance(c,Dog))
print('c是否是Dog类型:',isinstance(c,Dog))
print('c是否是Animal类型:',isinstance(c,Animal))
print('b是否是Dog数据类型:',isinstance(b,Dog))  #b是否是Dog数据类型: False

##输出内容:
Dog is running...
Cat is running...
a是否是list类型: True
b是否是Animal类型: True
c是否是Dog类型: True
c是否是Dog类型: True
c是否是Animal类型: True
b是否是Dog数据类型: False

可以看到c既是Dog类型又是Animal类型。该怎么理解?
在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以看作是父类。但是反过来不行,如下:

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def run(self):
        print('Dog is running...')

class Cat(Animal):
    def run(self):
        print('Cat is running...')

class Bird(Animal):
    def run(self):
        print('Bird is flying the sky...')

def run_two_times(animal):
    animal.run()
    animal.run()

run_two_times(Animal())
run_two_times(Dog())
run_two_times(Cat())
run_two_times(Bird())

##输出内容:
Animal is running...
Animal is running...
Dog is running...
Dog is running...
Cat is running...
Cat is running...
Bird is flying the sky...
Bird is flying the sky...

新增的Animal子类Bird不必对run_two_tomes()方法做任何修改。实际上,任何依赖Animal作为参数的函数或方法都可以不加修改的正常运行,原因就在于多态。

 

多态的好处:
当我们需要传入Dog、Cat、Bird等对象时,只需要接收Animal类型就可以了,因为Dog、Cat、Bird都是Animal类型,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此传入的类型只要是Animal类或者继承自Animal类,都会调用实际类型的run()方法。

多态对于一个变量,我们只需要知道它是Animal类型,无需确切知道它的子类型,就可以方法调用run()方法,具体调用的run方法作用于Animal、Cat、Dog、或Bird对象,由运行时该对象的确切类型决定。

 

封装:封装是全局作用域中其他地区隐藏多余信息的原则。听起来有些像多态,使用对象而不用知道其内部细节。它们都是抽象原则,都会帮忙处理程序组件而不用关心过多细节,就像函数一样。封装并不等同于多态,多态可以让用户对不知道类的对象进行方法调用,而封装可以不用关心对象是如何创建的,直接使用即可。
 

class Student(object):
    def __init__(self,name,score):
        self.name=name
        self.score=score

std=Student('lucky',96)

def info(std):
    print('学生: %s;分数: %s' % (std.name,std.score))

info(std)

##输出结果:
学生: lucky;分数: 96

///

class Student(object):
    def __init__(self,name,score):
        self.name=name
        self.score=score

    def info(self):
        print('学生: %s;分数: %s' % (self.name,self.score))

stu=Student('lucky',96)
stu.info()

##输出结果:
学生: lucky;分数: 96

这样一来,我们从外部看Student类,只需要知道创建实例需要给出的name和socre,如何输出是在Student类内部定义的,这些数据和逻辑被封装起来,调用很容易,但却不知道内部实现的细节。

 

多重继承

语法:

class DerivedClassName(Base1,Base2,Base3):
   <statement-1>
   ...
   <statement-2>

多重继承就是有多个基类。

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

 

假设要实现4种动物:Dog(狗)、Bat(蝙蝠)、Parrot(鹦鹉)、Ostrich(鸵鸟)

如果按照哺乳动物和鸟类分类:

  • 哺乳类:能跑的哺乳类和能飞的哺乳类
  • 鸟类:能跑的鸟类和能飞的鸟类

哺乳类:Dog和Bat  

  •    能跑的哺乳类:Dog
  •    能飞的哺乳类:Bat   

鸟类:Parrot和Ostrich

  •    能跑的鸟类:Ostrich
  •    能飞的鸟类:Parrot
class Animal(object):
    pass

 #大的分类
class Mammal(Animal):
    pass

class Bird(Animal):
    pass

#定于能跑和能飞的类
class Runnable(object):
    def run(self):
        print('Running...')

class Flable(object):
    def fly(self):
        print('Flying...')

#各种动物分类
class Dog(Mammal,Runnable):
    pass

class Bat(Mammal,Flyable):
    pass

class Parrot(Bird,Flyable):
    pass

class Ostrich(Bird,Runnable):
    pass

通过上面的多重继承,一个子类就可以继承多个基类,同时获得多个基类所有非私有功能。

 

扩展学习,参考链接:

 

  • 面向对象
    • 面向对象(1):从代码复用开始
    • 面向对象(2):设置对象属性
    • 面向对象(3):类和对象的名称空间
    • 面向对象(4):编码细节和注意事项
    • [] 面向对象(5):运算符重载
    • 面向对象(6):杂七杂八的知识点
    • dir()和__dict__属性的区别
  • 其它面向对象的话题
    • 管理属性1:基础
    • 管理属性2:property
    • 管理属性3:理解描述符descriptor
    • 装饰器1:函数装饰器
    • 装饰器2:类装饰器
    • 装饰器3:进阶
    • [] 元类

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解python之面向对象 的相关文章

  • 从 python-rq 获取*所有*当前作业

    我正在使用 python rq 来管理基于 Redis 的作业 并且我想确定我的工作人员当前正在处理哪些作业 python rq 提供 get current job 函数来查找连接的 当前作业 但是 我无法让它发挥作用 并且 我真的想要一
  • 时间序列的线性回归Python(numpy或pandas)

    我对 python 和一般编程都很陌生 所以请原谅任何简单的错误 应该显而易见的事情 我想做的事情非常简单 我只想将线性趋势 一维多项式 拟合到一堆时间序列上 看看斜率是正还是负 现在我只是想让它在一个时间序列中工作 问题 pandas 和
  • Pandas 在日期列上重新采样

    我有一个dataframe以日期作为列 我想对每日到每月的值进行平均 我尝试过使用 Time Grouper 和 Resample 但它不喜欢列名称是字符串 我似乎可以弄清楚如何将列变成类似DatetimeIndex 我的起始数据框 imp
  • 以编程方式设置 mosquitto 中的访问控制限制

    我正在开发一个将使用 mqtt 的应用程序 我将使用 python 库 我一直倾向于使用 mosquitto 但找不到以编程方式为其设置访问控制限制的方法 我正在编写的应用程序需要能够区分用户 并且只允许他们订阅某些主题 当前的解决方案看起
  • 自定义 pytest junitxml 失败报告

    我正在尝试内省测试失败并将附加数据包含到 junit xml 测试报告中 具体来说 这是对外部产品的一套功能测试 我想将产品的日志包含到故障报告中 使用找到的方法here https stackoverflow com questions
  • python 函数中的任意数量的参数

    我想学习如何在 python 函数中传递任意数量的参数 所以我以递归方式编写了一个简单的 sum 函数 如下所示 def mySum args if len args 1 return args 0 else return args 1 m
  • 为什么 itertools.chain 比扁平列表理解更快?

    在评论中的讨论中这个问题 https stackoverflow com questions 49630581 why does python forbid the use of sum with strings有人提到 虽然连接字符串序列
  • Python 列联表

    作为我正在编写的项目的一部分 我正在生成很多很多列联表 工作流程是 获取具有连续 浮点 行的大型数据数组 并通过分箱将其转换为离散整数值 例如 结果行的值为 0 9 将两行切片为向量 X 和 Y 并生成列联表 https en wikipe
  • Python相对导入导致语法错误:无效语法

    我正在尝试安装这个很棒的 python 模块Python Chrono http oss codepoet no python chrono wiki Home我的 python 环境 但至少在 python 2 4 3 和 2 6 6 中
  • buildozer android NDK 未下载 Ubuntu

    我使用的是 Ubuntu 16 04 LTS 操作系统 我已经在 python2 和 python3 中安装了 buildozer android sdk 已安装 但 buildozer 在下载 android NDK 时显示错误 请帮我解
  • 在 Python 中通过 TCP 套接字发送文件

    我已经成功地将文件内容 图像 复制到新文件 然而 当我通过 TCP 套接字尝试同样的事情时 我遇到了问题 服务器循环未退出 客户端循环在到达 EOF 时退出 但服务器无法识别 EOF 这是代码 Server import socket Im
  • Python 中函数未定义错误

    我试图在 python 中定义一个基本函数 但当我运行一个简单的测试程序时 我总是收到以下错误 gt gt gt pyth test 1 2 Traceback most recent call last File
  • 尝试导入 cv2(opencv-python) 包时出错

    我正在尝试使用 cv2 opencv python 包访问我的网络摄像头 当我尝试导入它时 出现此错误 Traceback most recent call last File server py line 6 in
  • 使用变量访问 Django 模板中的字典元素

    情况如下 我们渲染一个视图 return render request test html db object db object dict dict 在模板中 我们现在想要访问字典db object key 在Python中你通常会这样做
  • 跳过一个端点的 Flask 日志记录?

    我有一个 Python Flask 应用程序 有一项运行状况检查经常访问一个端点 但我不想在日志中看到它 如何仅禁用一个 GET 端点的日志记录 而保留其他所有端点的日志记录 艾蒂安 贝尔萨克为我指明了正确的方向 这就是我的实现方式 fro
  • 带有第二个 y 轴的 Seaborn 图

    i wanted to know how to make a plot with two y axis so that my plot that looks like this to something more like this by
  • 在 Python 的内置数字类型上,repr 和 str 总是相同吗?

    Are repr and strPython 内置数字类型相同 int bool float and complex 或者是否存在 深奥的 两者可能产生不同结果的情况 SO的相关问题 例如this one https stackoverfl
  • 将多列传递给 groupby.transform

    据我所知 当您使用 DataFrame 列调用 groupby transform 时 该列将传递给转换数据的函数 但我无法理解的是如何将多个列传递给函数 people DataFrame np random randn 5 5 colum
  • 如何从初始化参数中正确设置 Python 类属性

    作为一名 Python 程序员 我经常声明类似的类 class Foo def init self attr1 attr2 attr3 attr4 attr5 attr6 attr7 attr8 attr9 self attr1 attr1
  • pandas 数据框中的 count 和 countif

    我有一个 DF 如下所示 trainee course completed days overdue Ava ABC Yes 0 Bob ABC Yes 1 Charlie DEF No 10 David DEF Yes 0 Emily D

随机推荐

  • 移远ec20模式与切换

    移远EC20支持4种模式 0 rmnet模式 通过QMI工具发的QMI命令 xff0c 获取公网IP 这种模式可以配合usb ecm驱动或高通GobiNet驱动使用 1 ecm模式 通过标准的CDC ECM发起data call xff0c
  • STM32开发必备知识篇:串口DMA空闲中断

    随着撰写博客的深入 xff0c 笔者先初步打算把博客细分为四大板块 xff1a 1 FPGA基础知识篇 xff1b 2 FPGA 20个例程篇 xff1b 3 STM32开发必备知识篇 xff1b 4 STM32 10个项目篇 xff0c
  • 大端小端(Big- Endian和Little-Endian)

    字节序 xff08 Endian xff09 xff0c 大端 xff08 Big Endian xff09 xff0c 小端 xff08 Little Endian xff09 图文并茂 http www cppblog com tx7d
  • STM32程序设计规范浅析

    这篇博客写到 STM32基础知识篇 里 xff0c 一方面是一个很好地对过往工作的总结 xff0c 另一方面也是整个专栏撰写计划的开端 xff0c 古人云 xff1a 良好的开端是成功的一半 xff0c 在文章的最后详细地规划了整个专栏后期
  • C语言编程规范(头文件规范)

    C语言的规范使用 xff0c 有利于提高代码的清晰 简洁 可测试 安全 效率 可移植 xff0c 因此必须规范使用C语言编程 代 码 总 体 原
  • C语言变量和常量命名规则

    变量命名规则 原则 1 一个变量只有一 个功能 xff0c 不能把一个变量用作多个用途 2 结构单一 xff0c 不能设计面面俱到的数据结构 xff1b 结构的定义应该明确的描述一个对象 xff0c 去掉相关相不强的数据 xff1b 3 不
  • ROS+Gazebo----Unable to find uri[model:// ]

    基于ROS 43 Gazebo环境 xff0c 用roslaunch把sdf模型加载到gazebo仿真世界 目录结构如下 输入命令roslaunch my simulation my world launch 报错 xff1a 1 不接入网
  • 最完整介绍Visual C++ 6.0和Visual Studio 2022中的编译、生成和运行(CTRL+F7、F7、CTRL+F5)

    我是荔园微风 xff0c 作为一名在IT界整整25年的老兵 xff0c 经常被Visual C 43 43 6 0和Visual Studio 2022初学者问到程序写好后怎么使用编译调试菜单以及怎么使用CTRL 43 F7 F7 CTRL
  • 判断大小端的方法(java和c++)

    首先我们给出大小端的定义 小端 xff1a 较高的有效字节存放在较高的的存储器地址 xff0c 较低的有效字节存放在较低的存储器地址 大端 xff1a 较高的有效字节存放在较低的存储器地址 xff0c 较低的有效字节存放在较高的存储器地址
  • vscode配置c++代码提示补全

    vscode配置c 43 43 代码提示补全 在网上找了大半天 xff0c 说的方式都试过了 xff0c 都没有适合我的 xff0c 还是自己找stackoverflow靠谱点 34 editor rulers 34 80 一行限制80字符
  • 解决头文件相互包含问题的方法

    解决头文件相互包含问题的方法 所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数 一般情况下 xff0c C C 43 43 要求所有的类型必须在使用前被定义 xff0c 但是在一些特殊情况下 xff0c 这种要求无法满足 xff
  • C++ 中头文件相互包含问题的解决办法

    我们在写C 43 43 程序的时候 xff0c 常常要把不同的类的声明放置与不同的头文件中 xff0c 以提高代码的整洁性 xff0c 如此一来 xff0c 就难免会遇到头文件相互包含的问题 xff0c 也就是说 xff0c 假设我们有两个
  • Pixhawk_nuttx启动过程和启动文件

    lt span style 61 34 font family Arial Helvetica sans serif background color rgb 255 255 255 34 gt Pixhawk nuttx启动过程 lt s
  • 施密特触发器原理图解

    施密特触发器原理图解详细分析 重要特性 xff1a 施密特触发器具有如下特性 xff1a 输入电压有两个阀值VL VH xff0c VL施密特触发器通常用作缓冲器消除输入端的干扰 施密特波形图 施密特触发器也有两个稳定状态 xff0c 但与
  • Delphi 类库(DLL)动态调用与静态调用示例讲解

    在Delphi或者其它程序中我们经常需要调用别人写好的DLL类库 下面直接上示例代码演示如何进行动态和静态的调用方法 DLL动态调用与静态调用的例子 编译环境 Delphi XE 转载或编译请不要修改此文件
  • HTML中的Hack手段之条件注释

    通常WEB 的好处就是可以跨平台 但这个世界偏偏有个另类 就是IE 浏览器 在平常做HTML 设计时 xff0c 有时需要为IE 的表示差异而不得不使用一些Hack 手段 条件注释就是这类手段之一 条件注释是IE 浏览器的 专利 也就是说我
  • JavaScript函数中的arguments对象

    ECMAScript标准中 xff0c 每个函数都有一个特殊的内置对象arguments arguments对象是一个类Array对象 object 用以保存函数接收到的实参副本 一 内置特性 说它是一个内置对象是因为我们在创建函数时并没有
  • JavaScript函数之高阶函数

    高阶函数 xff08 higher order function xff09 如果一个函数接收的参数为或返回的值为函数 xff0c 那么我们可以将这个函数称为高阶函数 众所周知 xff0c JavaScript是一种弱类型的语言 JavaS
  • 前端优化建议:合理利用JavaScript的条件运算符

    在最近的项目中要使用到一个格式化文件大小的算法 xff0c 于是不假思索写了如下代码 function formatSize size if size lt 1024 return size 43 34 B 34 else if size
  • 了解python之面向对象

    了解python之面向对象 面向对象概念 xff1a 面向对象编程 xff08 Object Oriented Programming xff0c 简称OOP xff09 是一种程序涉及思想 OOP把对象作为程序的基本单元 xff0c 一个