导航:首页 > 编程语言 > pythonclass属性

pythonclass属性

发布时间:2022-05-23 14:19:21

python中类属性和实例属性的区别

今天一同事说踩了python的坑,
这确实是个“坑”
但是我觉得python之所以这样设计,就是明确要求写代码的人知道自己在写什么^
^
python的实例属性必须在__init__(self)
方法中定义,直接跟在类名后边定义的属性都默认是类属性(类似于c++的static变量)。
而python实例又可以灵活的随便增加属性,便出现了图片中看似诡异的现象。
---------------------------------
我们来看一下他的原代码:
你觉得输出会是什么?
结果是
model_path
分别是
"xx_model"

"oo_model"
而model_dict全都是第二次调用的结果,也就是oo_model生成的dict的值(注意,他前边有一句self.model_dict.clear()

原因是什么呢?
"坑"
就在
他是用self.xxxx
这种方式引用变量,而不是self.__class__.xxxx
(1)
self.model_path=path;
#这对self.model_path进行了赋值,python中的第一次赋值视为变量的定义!
(2)
self.xxxx这种格式的第一次赋值含义是什么呢?-->含义是:定义,也就是说定义了一个名为xxxx的实例属性。
(3)
因此m1,m2的两次调用,分别定义了对应的(不同的)self.model_path属性。
而self.model_dict,从头到尾都是
引用
它,从未进行过
赋值(重定义),所以引用的都是
类属性

编程语言python的类(class)的问题

很不想跟你说, 你思维一片混乱. 根本不适合写程序.

先搞清楚类和对象的区别再说吧.
-----------------------------------
你的态度很好, 我的态度不好,我道歉.

1 类和对象是两种不同的概念, 类是一个抽象的定义, 对象是一个实际的实体. 我不想抄书, 举个例子, "人"是一个类. "某人"就是一个对象
对于你的问题, Liste是一个类, i.first里面的这个i,就是一个对象(称为Liste对象)。 i.first=n,表示修改了i这个对象的first属性。 如果还有其它Liste对象, 这些对象的first值并不与i的first相关。
然后, 你说的class的属性的初始值,这个说法并不精确。 因为 first属性是在__init__方法中定义的, 而__init__方法是初始化任意一个Liste对象时都要调用的方法。因此你理解他为初始值。但是实际上, __init__方法给属性赋值,与你在外面一个函数给这个属性赋值没有大区别。
因此,我这样总结一下, 比如, 你声明了两个Liste对象 i=Liste() j=Liste(), 然后让i.first=n, 之后, j.first还是依旧等于None, 然后,你又声明了一个Liste对象, k=Liste(), k.first还是等于None

2 当你定义了一个类, 之后要创建一个这个类的对象, 我们用的方示就是
n=Node(x), 在这里类的名字当成一个函数来用, 而这个函数的参数x, 传递进入 None类的 __init__方法中去,也就是def __init__(self, x):这个方法。 因此n 就是一个Node对象,你看到print出来的内容就是表示n是一个None对象, 而其储存地址是0x0....

3 你的理解是对的。

我建议你学习编程, 还是要从C或者Pascal学起, 把最基本的理论都搞清楚以后,然后再学习C++,弄明白面向对象,最后再学习python, 循序渐进对于打好扎实的基础是很重要的。

㈢ python类的属性有哪几种如何访问它们

属性的访问机制

一般情况下,属性访问的默认行为是从对象的字典中获取,并当获取不到时会沿着一定的查找链进行查找。例如a.x的查找链就是,从a.__dict__['x'],然后是type(a).__dict__['x'],再通过type(a)的基类开始查找。

若查找链都获取不到属性,则抛出AttributeError异常。

一、__getattr__方法

这个方法是当对象的属性不存在是调用。如果通过正常的机制能找到对象属性的话,不会调用__getattr__方法。

classA:
a=1
def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)
#output
1
__getattr__call
b

二、__getattribute__方法

这个方法会被无条件调用。不管属性存不存在。如果类中还定义了__getattr__,则不会调用__getattr__()方法,除非在__getattribute__方法中显示调用__getattr__()或者抛出了AttributeError。

classA:
a=1
def__getattribute__(self,item):
print('__getattribute__call')
raiseAttributeError

def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)

所以一般情况下,为了保留__getattr__的作用,__getattribute__()方法中一般返回父类的同名方法:

def__getattribute__(self,item):
returnobject.__getattribute__(self,item)

使用基类的方法来获取属性能避免在方法中出现无限递归的情况。

三、__get__方法

这个方法比较简单说明,它与前面的关系不大。

如果一个类中定义了__get__(),__set__()或__delete__()中的任何方法。则这个类的对象称为描述符。

classDescri(object):
def__get__(self,obj,type=None):
print("callget")

def__set__(self,obj,value):
print("callset")

classA(object):
x=Descri()

a=A()
a.__dict__['x']=1#不会调用__get__
a.x#调用__get__
如果查找的属性是在描述符对象中,则这个描述符会覆盖上文说的属性访问机制,体现在查找链的不同,而这个行文也会因为调用的不同而稍有不一样:

㈣ Python中的类属性和对象属性的区别详解

类属性:
class Employee(object):
emCount=0
def __init__(self,name,salary):
self.nane=name
self.salary=salary
类属性就是定义类的时候直接定义的属性 emCount,类似于java里面的static修饰的属性,可以直接通过 类名.属性名访问:Employee.emCount
实例属性是在__init()方法中定义的属性,例如name,和salary,self是指向自己的,类似java的this关键字,实际是通过内置的方法setattr()完成的
可以通过重写setatttr()进行类属性的增加和获取

㈤ python中class自赋属性值的使用问题

  1. self.start = start#为什么要设定这么一个属性值start

    举例:

    g=Game(start=2)
    print(g.start)#不设定那个属性值的话,这句就会报错
  2. room = getattr(self, next) #这个地方怎么理解room该取得的值呢?为什么会用到next?为什么实际用到了属性值start

    这句在该例中 相当于room=getattr(self, "tsroom"),也即room=self.tsroom

    至于怎么理解,这个很难讲的请,只能说你了解语法之后,再自个儿琢磨琢磨。


㈥ python类的定义与使用是什么

类Class:用来描述具体相同的属性和方法的对象的集合。定义了该集合中每个对象所共有的属性和方法。对象是类的示例。

类定义完成时(正常退出),就创建了一个 类对象。基本上它是对类定义创建的命名空间进行了一个包装;我们在下一节进一步学习类对象的知识。原始的局部作用域(类定义引入之前生效的那个)得到恢复,类对象在这里绑定到类定义头部的类名(例子中是 ClassName )。

基本语法

Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和意外。

以上内容参考:网络-Python

㈦ 谈谈python中类属性和类实例的属性的区别

一般来说,在Python中,类实例属性的访问规则算是比较直观的。

但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此。

在这里,我们需要明白以下几个地方:

1.Python是一门动态语言,任何实体都可以动态地添加或删除属性。
2.一个类定义了一个作用域。
3.类实例也引入了一个作用域,这与相应类定义的作用域不同。
4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找。
5.在对类实例属性进行赋值的时候,实际上会在类实例定义的作用域中添加一个属性(如果还不存在的话),并不会影响到相应类中定义的同名属性。

下面看一个例子,加深对上述几点的理解:

复制代码
代码如下:

class A:
cls_i = 0
cls_j
= {}
def __init__(self):
self.instance_i =
0
self.instance_j =
{}

在这里,我们先定义类A的一个实例a,然后再看看类A的作用域和实例a的作用域中分别有什么:

复制代码
代码如下:

>>> a = A()
>>>
a.__dict__
{'instance_j': {}, 'instance_i': 0}
>>>
A.__dict__
{'__init__': , '__mole__': '__main__', 'cls_i': 0, 'cls_j': {},
'__doc__': None}

我们看到,a的作用域中有instance_i和instance_j,A的作用域中有cls_i和cls_j。

我们再来看看名字查找是如何发生的:

复制代码
代码如下:

>>> a.cls_i
0
>>>
a.instance_i
0

在查找cls_i的时候,实例a的作用域中是没有它的,却在A的作用域中找到了它;在查找instance_i的时候,直接可在a的作用域中找到它。

如果我们企图通过实例a来修改cls_i的值,那会怎样呢:

复制代码
代码如下:

>>> a.cls_i = 1
>>>
a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>>
A.__dict__
{'__init__': , '__mole__': '__main__', 'cls_i': 0, 'cls_j': {},
'__doc__': None}

我们可以看到,a的作用域中多了一个cls_i属性,其值为1;同时,我们也注意到A作用域中的cls_i属性的值仍然为0;在这里,我们其实是增加了一个实例属性,并没有修改到类属性。

如果我们通过实例a操纵cls_j中的数据(注意不是cls_j本身),又会怎么样呢:

复制代码
代码如下:

>>> a.cls_j['a'] =
'a'
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i':
0}
>>> A.__dict__
{'__init__': , '__mole__': '__main__',
'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}

我们可以看到a的作用域没有发生什么变化,但是A的作用域发生了一些变化,cls_j中的数据发生了变化。

实例的作用域发生变化,并不会影响到该类的其它实例,但是类的作用域发生变化,则会影响到该类的所有实例,包括在这之前创建的实例:

复制代码
代码如下:

>>> A.cls_k = 0

㈧ python 类里面的class是什么意思啊求

python这方面很灵活。其实java也一样允许这样子。你几乎可以在任何情况下做任何事情。
通常class Meta可以放在外面。不过,这样它就不能直接访问父类的一些属性了。

所以在python里class 如果放在另一个class 里面,通常并不是为了隐藏这个class,并不是让别人看不到它。而因为它需要父类里的一些属性。需要共享。

另外直接在类里定义的一些变量,比如queryset,也是属于类全局级的。只要引用了这个类,即使没有初始化,这些变量也已经实例化。这个有些象是java里static的全局定义结果。

我们通常用这个方法来在不同的函数变量间共享 一部分数据。同时又不需要初始化一个实例并用指针指向这一部分数据。而是通过类名直接引用。

比如下面的一个用法
class Config:
pass
Config.user_name="xxx"
Config.password="yyyy"
这样。只要你在当前模块里,通过Config就可以引用到user_name和password,而不需要global这个修饰符。

㈨ python关于class的问题

对象构造后第一个调用的函数,在python里面实例的属性是可以动态构建的,在类里面定义的属性是类属性,不是实例属性,定义实例自己的属性的最好地方是__init__函数里面。
比如
class TEST():
class_attr #类属性,通过TEST.class_attr调用,如果用instance.class_attr调用实际上是声明类另一个实例属性,与之前的TEST.class_attr不是一个东西了

def __init__(self,other):

self.class_attr #实例属性,与之前的那个属性处于不同的名字空间了,不是一个东西。

self.other=other

总之,__init__可以用来声明实例属性,以及进行必要的初始化。
希望能解决您的问题。

㈩ python关于class问题 小白求解答

Python编程中类的概念可以比作是某种类型集合的描述,如“人类”可以被看作一个类,然后用人类这个类定义出每个具体的人——你、我、他等作为其对象。类还拥有属性和功能,属性即类本身的一些特性,如人类有名字、身高和体重等属性,而具体值则会根据每个人的不同;功能则是类所能实现的行为,如人类拥有吃饭、走路和睡觉等功能。具体的形式如下:

#例:类的概念
class人类:
名字='未命名'#成员变量
def说话(内容):#成员函数
print内容#成员变量赋初始值

某人=人类()#定义一个人类对象某人
某人.名字="路人甲"
某人.说话('大家好')#路人甲说话
>>>大家好!#输出

Python中定义和使用类的形式为:class 类名[(父类名)]:[成员函数及成员变量],类名为这个类的名称,而父类名为可选,但定义父类名后,子类则拥有父类的相应属性和方法。在用类定义成对象时,会先调用__init__构造函数,以初始化对象的各属性,类的各属性(成员变量)均可以在构造函数中定义,定义时只要加上对象指针就好了。而在对象销毁时,则会调用__del__析构函数,定义类的成员函数时,必须默认一个变量(类似于C++中的this指针)代表类定义的对象本身,这个变量的名称可自行定义,下面例子将使用 self变量表示类对象变量 。

#例:类定义及使用
classCAnimal:
name='unname'#成员变量
def__init__(self,voice='hello'):#重载构造函数
self.voice=voice#创建成员变量并赋初始值
def__del__(self):#重载析构函数
pass#空操作
defSay(self):
printself.voice

t=CAnimal()#定义动物对象t
t.Say()#t说话
>>hello#输出
dog=CAnimal('wow')#定义动物对象dog
dog.Say()#dog说话
>>wow#输出
阅读全文

与pythonclass属性相关的资料

热点内容
java聊天窗口 浏览:976
单片机控制阵列led灯 浏览:577
白鹿用的什么APP修图 浏览:499
阿里云轻量应用服务器ssh无法连接 浏览:794
员工福利系统源码 浏览:982
数据加密如何设置 浏览:570
php取余运算 浏览:153
php如何压缩图片大小 浏览:137
编程三阶教程 浏览:983
pdf颜色查看 浏览:469
怎么用指令停用命令方块java 浏览:406
鼠标命令行 浏览:567
如何朗读pdf 浏览:746
压缩机启动后继电器发烫 浏览:405
小学编程项目学习 浏览:557
net编译运行原理 浏览:786
加密电脑的文件拷出来打不开 浏览:366
可达性算法根 浏览:208
ibm的服务器怎么安装系统 浏览:492
pdftomobi在线 浏览:797