Skip to content

动态访问类中的属性方法

动态地方法类中的属性方法,也是一种反射机制。 python中的反射/自省的实现,是通过hasattr、getattr、setattr、delattr四个内置函数实现的,其实这四个内置函数不只可以用在类和对象中,也可以用在模块等其他地方,只是在类和对象中用的很多,所以单独提出来进行解释。

python
hasattr(key) # 返回的是一个bool值,判断某个成员或者属性在不在类或者对象中
getattr(key,default=xxx) # 获取类或者对象的成员或属性,如果不存在,则会抛出AttributeError异常,如果定义了default那么当没有属性的时候会返回默认值。
setattr(key,value)#假如有这个属性,那么更新这个属性,如果没有就添加这个属性并赋值value
delattr(key)#删除某个属性
python
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        return self.name,self.age

obj=Foo("Tom",18)
print(getattr(obj,"name"))  # Tom
setattr(obj,"k1",eat)
print(obj.k1) # <function eat at 0x00000162CAD661F0>
print(hasattr(obj,"k1")) # True
delattr(obj,"k1")
show_fun=getattr(obj,"show") 
print(show_fun()) # ('Tom', 18)

使用字典

python
dynamic_fun = {"print": print }
dynamic_fun["print"]("hello,world!")

类中其他内建属性方法(魔术方法)

init # 构造初始化函数,__new__之后运行
new # 创建实例所需的属性,类似于构造方法
call # 可以使得类的实例通过function方式访问
class# 实例所在的类,实例.class
str # 实例的字符串表示,可读性高
repr # 实例的字符串表示,准确性高
del # 删除实例引用,类似于析构方法
dict # 实例自定义属性,vars(实例.dict)
doc # 类文档,help(类或者实例)
bases #当前类的所有父类
getattribute#属性访问拦截器


卷积示意图

9种生成方法

python
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
python
point1 = Point(1, 2)  
point2 = eval("{}({}, {})".format("Point", 1, 2))  
point3 = globals()["Point"](1, 2)  
point4 = locals()["Point"](1, 2)  
point5 = getattr(sys.modules[__name__], "Point")(1, 2)  
point6 = copy.deepcopy(point1)  
point7 = point1.__class__(1, 2)  
point8 = type('Point', (Point, ), {})(1, 2)
point9 = types.new_class('Point', (Point, ), {})(1, 2)

动态生成类type

python
Test = type('Test',(object,),{'num':0})  # 所有类都是type的对象,param1为类名,param2为继承对象,num为类属性,方法`

class Test(object): # 与上述代码等效
    num = 0

copy

python
copy.deepcopy()

import方式

python
from Point import Point1 #用这个
# from Point import * #或这个
type(Point1)#Point.Point1

import Point    #感觉还是算了
type(Point.Point1)#Point.Point1

cmd命令

fsutil file createnew e:\b.txt 1073741824 cmd命令生成大的空文件

路径

python
# sys.path.append(os.getcwd())
# sys.path.append(os.path.abspath(__file__))
# sys.path.insert(0,os.path.abspath(__file__))

numba是用来另一种python编译的方式,可用于加速循环,numpy本身矩阵计算速度不慢 初始import librosa库时一直报错,按照网络经验,更改系统变量TEMP的地址,使其不含中文即可。

镜像源

示例0 python -m pip uninstall librosa 示例1 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pyside6
示例2 pip install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pyside6 --force-reinstall

清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中理工大学:http://pypi.hustunique.com/

山东理工大学:http://pypi.sdutlinux.org/

豆瓣:http://pypi.douban.com/simple/ 不同数量的#可以完成不同的标题,如下:

pip install --target=E:\Python_all\Python310\Lib\site-packages pillow

python
python -m ensurepip
# 重新升级
python -m pip install --upgrade pip

https://pygobject.readthedocs.io/en/latest/getting_started.html#windows-logo-windows
https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/x86_64/

教程国内镜像msys2

https://www.cnblogs.com/CodeWorkerLiMing/p/12274583.html
Path 的 Home 位置是运行 python3 hello.py 的路径

pytorch

我的电脑的cuda,在
torch-1.13.0+cu117-cp39-cp39-win_amd64
这里面117是cuda版本,cp39指python3.9

setuptools

❝setuptools是python标准的打包分发工具,它可以将我们编写的python项目打包安装,这样其他同事就可以像调用标准库或python第三方库那样直接使用;也可以将项目上传到Pypi供更多人的下载安装使用。 ❞

python
# 一个例子
import os

from setuptools import find_packages, setup

with open(os.path.join("panda_gym", "version.txt"), "r") as file_handler:
    __version__ = file_handler.read().strip()

with open("README.md", "r") as f:
    long_description = f.read()

setup(
    name="panda_gym",
    description="Set of robotic environments based on PyBullet physics engine and gymnasium.",
    author="Quentin GALLOUÉDEC",
    author_email="gallouedec.quentin@gmail.com",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/qgallouedec/panda-gym",
    packages=find_packages(),
    include_package_data=True,
    package_data={"panda_gym": ["version.txt"]},
    version=__version__,
    install_requires=["gymnasium>=0.26", "pybullet", "numpy", "scipy"],
    extras_require={
        "develop": ["pytest-cov", "black", "isort", "pytype", "sphinx", "sphinx-rtd-theme"],
    },
    classifiers=[
        "License :: OSI Approved :: MIT License",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
    ],
)

Released under the MIT License.