×

python类属性

python类属性(Python中的类属性和对象属性的区别详解)

admin admin 发表于2024-03-31 14:57:36 浏览23 评论0

抢沙发发表评论

大家好,关于python类属性很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Python中的类属性和对象属性的区别详解的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

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

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

Python 获取类属性

通常情况下,我们在类对象中定义的属性都会设置访问权限,外部程序无法直接获取,防止恶意的修改,当属性被设置为私有属性后,外部程序该如何访问呢? 例:使用普通方法访问私有属性 例:使用property方法访问私有属性 property()方法接收两个参数,第一个参数为获取属性需要调用的实例方法名,第二个参数为设置属性需要调用的实例方法名,返回值就设置为需要设置、获取的属性名。 当执行到实例.属性时,就会调用获取实例属性的方法,当执行到实例.属性 = xxx时,就会调用设置实例属性的方法。 例:使用@property/@xxx.setter装饰器访问私有属性

请问python中类的属性怎么初始化为一个列表

你的表述很有问题,问题本身便是错的。列表与其他类型的数据一样,都可以作为实参传入类和函数,而python在定义形参的时候是不指定类型的,所以完全不知道你为何有此一问。但不论如何,你可以参考以下代码。class Student:def __init__(self, name, age, scorelist): #构造函数,第一个参数为实例本身,按要求后接三个形参self.name = name #属性:姓名self.age = age #属性: 年龄self.scorelist = scorelist #属性:成绩列表def get_name(self):return str(self.name)def get_age(self):return int(self.age)def get_course(self):return int(max(self.scorelist))#self.scorelist便是传入的list实参,用max()函数取出最大值,再强制转换为int型。zm = Student(’zhangming’,20,)print(zm.get_name())print(zm.get_age())print(zm.get_course())

python类中的 方法 属性分别什么意思

很抽象 没办法回答

属性:就是类对象的属性,存储某个值 这个值的代号可以称为类的属性

方法:把每一项类中所有的功能封装起来称为方法,一般方法里的内容就是方法的执行过程。

举例: 比如类表示的是People 也就是人 

           人的类中会有一些属性 这些属性大概是 身高、体重、姓名等等

           那么方法比如是 跑、吃、等等 

     

Class People():    def __init__(self, name):        self.name = name        self.height = 0        # 比如说跑了一次之后 身高就增长了1个单位    def run():        print "开始奔跑"        self.height += 1        print "奔跑结束"

上面的例子 run就是方法 ;name 和 height就是属性

run的方法执行过程就是跑完之后 height就加1

不知道这样讲你能明白吗

python中类属性和实例属性名字冲突怎么办

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

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

属性的访问机制

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

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

一、__getattr__ 方法

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

class A:a = 1def __getattr__(self, item):print(’__getattr__ call’)return itemt = A()print(t.a)print(t.b)# output1__getattr__ callb

二、__getattribute__ 方法

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

class A:a = 1def __getattribute__(self, item):print(’__getattribute__ call’)raise AttributeErrordef __getattr__(self, item):print(’__getattr__ call’)return itemt = A()print(t.a)print(t.b)

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

def __getattribute__(self, item):return object.__getattribute__(self, item)

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

三、__get__ 方法

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

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

class Descri(object):def __get__(self, obj, type=None):print("call get")def __set__(self, obj, value):print("call set")class A(object):x = Descri()a = A()a.__dict__ = 1  # 不会调用 __get__a.x                  # 调用 __get__如果查找的属性是在描述符对象中,则这个描述符会覆盖上文说的属性访问机制,体现在查找链的不同,而这个行文也会因为调用的不同而稍有不一样:

  • 如果调用是对象实例(题目中的调用方式),a.x 则转换为调用:。type(a).__dict__.__get__(a, type(a))
  • 如果调用的是类属性, A.x 则转换为:A.__dict__.__get__(None, A)
  • 其他情况见文末参考资料的文档

  • 四、__getitem__ 方法

  • 这个调用也属于无条件调用,这点与 __getattribute__ 一致。区别在于 __getitem__ 让类实例允许  运算,可以这样理解:
  • __getattribute__适用于所有.运算符;
  • __getitem__适用于所有  运算符。
  • class A(object):
  •     a = 1
  •     def __getitem__(self, item):
  •         print(’__getitem__ call’)
  •         return item
  • t = A()
  • print(t)
  • print(t)
  • 如果仅仅想要对象能够通过  获取对象属性可以简单的:

  • def __getitem(self, item):
  •     return object.__getattribute__(self, item)
  • 总结

    当这几个方法同时出现可能就会扰乱你了。我在网上看到一份示例还不错,稍微改了下:

  • class C(object):
  •     a = ’abc’
  •     def __getattribute__(self, *args, **kwargs):
  •         print("__getattribute__() is called")
  •         return object.__getattribute__(self, *args, **kwargs)
  •     #        return "haha"
  •     def __getattr__(self, name):
  •         print("__getattr__() is called ")
  •         return name + " from getattr"
  •     def __get__(self, instance, owner):
  •         print("__get__() is called", instance, owner)
  •         return self
  •     def __getitem__(self, item):
  •         print(’__getitem__ call’)
  •         return object.__getattribute__(self, item)
  •     def foo(self, x):
  •         print(x)
  • class C2(object):
  •     d = C()
  • if __name__ == ’__main__’:
  •     c = C()
  •     c2 = C2()
  •     print(c.a)
  •     print(c.zzzzzzzz)
  •     c2.d
  •     print(c2.d.a)
  •     print(c)
  • 可以结合输出慢慢理解,这里还没涉及继承关系呢。总之,每个以 __get 为前缀的方法都是获取对象内部数据的钩子,名称不一样,用途也存在较大的差异,只有在实践中理解它们,才能真正掌握它们的用法。

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 类中的私有属性有哪些

类的私有属性:__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。类的方法:在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数类的私有方法 :__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods实例:#!/usr/bin/python# -*- coding: UTF-8 -*-class JustCounter:__secretCount = 0 # 私有变量publicCount = 0 # 公开变量def count(self):self.__secretCount += 1self.publicCount += 1print self.__secretCountcounter = JustCounter()counter.count()counter.count()print counter.publicCountprint counter.__secretCount # 报错,实例不能访问私有变量Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性,将如下代码替换以上代码的最后一行代码: …………………….print counter._JustCounter__secretCount这样就可以访问私有属性了

关于本次python类属性和Python中的类属性和对象属性的区别详解的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。