python 类

python的类

  • 面向过程:面向处理,更多的是从计算机角度思考,注重计算每一个步骤,程序更像是一本cpu操作手册。
  • 面向对象:以日常生活的角度思考问题的解决,更接近人的思维方式,让人可以从更高的层面考虑系统的构建。
    面向对象的优点:
    • 面向对象更加适合做应用的开发
    • 面向对象可以使你的代码更加优雅和紧凑
    • 面向对象开发效率更高
    • 面向对象代码复用度更高、可维护性更好
    • 面向对象是一种思维方式,它认为万事万物皆对象,程序是由多个对象协作共同完成功能的,所以以后我们要从面向过程转向面向对象。以面向对象的方式考虑程序的构建。

面向对象的核心是:类和对象

问题->面向对象分析(OOA)->发现对象->类->用类实例化对象->对象协作完成功能

  • 生活角度
    类:具有相同特征和行为的对象的集合,是一个概念
    对象:客观存在的一切事物,是类的实例
  • 程序角度
    类:用户自定义的数据类型,是模板,不占用内存
    对象:由类定义的变量,占用内存

类的定义

#语法:
class 类名:
	类体

成员方法

成员方法其实就是函数,作用域在类内,成员方法的第一个参数必须是self,self代表当前对象,也就是调用这个方法的对象,这个参数由系统传递。

  • self参数在调用的时候不必传值,由系统传值
  • self只能在实例方法中使用
  • 方法和函数的区别:
    • 方法作用域属于类,所以即便和普通函数重名,也不会被覆盖
    • 方法的第一个参数必须是self,但函数不要求
    • 方法必须通过对象调用,而函数不需要
  • 方法的第一个参数self其实可以使任何合法标识符,不过一般约定俗成都是self
  • 方法的连贯调用
class Dog:
	def bark(self):
		print("汪汪汪")
		return self #返回self
	def eat(self):
		print("爱啃大骨头")
		return self
dog = Dog()
dog.eat().bark() #方法的连贯调用,方法要返回self

成员属性

成员属性描述的是对象的静态特征,比如说狗名字、品种等,其实就是一个变量,作用域属于对象,不会和类外的全局变量冲突。python中成员属性可以在构造函数中添加。成员属性属于对象,每个对象的成员属性的值都不同

封装

隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
类本身就是一种封装,通过类可以将数据(属性)和行为(方法)相结合,形成一个有机的整体,也就是将数据与对数据的操作有机的结合。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。成员私有化是实现封装的手段。所有的成员默认是公有。

如果想让类的内部属性不被外界直接访问,可以在这个属性的前面加两个下划线__, 在Python中,如果一个属性的前面出现__,就表示这个属性只能在当前类的方法中被直接访问,不能通过对象直接访问,这个变量就被称为私有变量

常见的在变量的前后加下划线的问题:

  • 单下划线:_age ----->受保护的 ,可以访问,但约定俗称,当你看到一个下划线开头的成员时不应该使用它
  • 双下划线:__age ------>私有的
  • 两边都双下划线:__age__------->系统内置变量

对于私有属性的访问,使用公开方法间接访问的方法太麻烦,python提供了一种便捷语法,属性装饰器器,通过属性装饰器,可以很方便的对私有属性进访问,属性装饰器可以把方法属性化。

class Dog:
	def __init__(self,name,gender,age):
		self.name = name
		self._gender = gender
		self.__age = age
	@property
	def age(self):
		return self.__age
	@age.setter
	def age(self,age):
		self.__age =age


if __name__ == "__main__":
	dog = Dog("tom","gong",5)
	print(dog.age)
	dog.age = 10
	print(dog.age)

如果对一个方法的名字前面加__,声明该方法为私有方法,只能在当前类中被调用,在外界不能通过对象直接调用,这就是私有方法

class Dog:
	def __init__(self,name,age):
		self.name = name
		self.age = age
	def __pee(self):
		print('这是我的地头')


if __name__ == "__main__":
	dog = Dog('dingding',5)
	#dog.__pee() #AttributeError: 'Dog' object has no attribute '__pee'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C中调用Python类的方法有多种方式。一种常见的方法是使用pybind11库。pybind11是一个C++库,可以在C++和Python之间进行无缝转换。它提供了一种简单的方式来将C++类绑定到Python,并且可以在C++中调用Python类的方法。通过使用pybind11,您可以在C++中创建一个Python模块,将C++类导出为Python类,并在C++中调用Python类的方法。 另一种方法是使用Python的C API。您可以使用Python的C API在C中调用Python类的方法。首先,您需要使用PyImport_ImportModule函数导入Python模块,然后使用PyObject_GetAttrString函数获取Python类的引用。接下来,您可以使用PyObject_CallMethod函数调用Python类的方法。 这是一个使用Python的C API在C中调用Python类的示例代码: ```c++ #include <Python.h> int main() { // 初始化Python接口 Py_Initialize(); // 导入Python模块 PyObject* pModule = PyImport_ImportModule("module_name"); if (pModule == NULL) { // 模块导入失败 return 1; } // 获取Python类的引用 PyObject* pClass = PyObject_GetAttrString(pModule, "class_name"); if (pClass == NULL || !PyCallable_Check(pClass)) { // 类引用获取失败或者不可调用 return 1; } // 创建类的实例 PyObject* pInstance = PyObject_CallObject(pClass, NULL); if (pInstance == NULL) { // 类实例创建失败 return 1; } // 调用类的方法 PyObject_CallMethod(pInstance, "method_name", NULL); // 释放资源 Py_DECREF(pInstance); Py_DECREF(pClass); Py_DECREF(pModule); // 结束Python接口初始化 Py_Finalize(); return 0; } ``` 请注意,上述代码中的"module_name"是要导入的Python模块的名称,"class_name"是要调用的Python类的名称,"method_name"是要调用的Python类的方法的名称。您需要根据实际情况进行相应的更改。 总结起来,您可以使用pybind11库或Python的C API在C中调用Python类的方法。这些方法可以让您在C和Python之间进行无缝的交互,并实现代码的扩展和功能的增强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值