当前位置:首页 » 文件传输 » 可以访问类的所有属性
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

可以访问类的所有属性

发布时间: 2023-03-08 09:14:40

Ⅰ 为什么类名可以直接访问类的属性和方法

如果回答:Java语言规范规定如此。你满意么?

类的静态属性和方法,跟普通的成员属性和方法,其最终的区别就在于前者是伴随着类定义的装载就完成初始化并提供直接访问了。

或者反过来问:如果连用类名都无法访问类的静态属性和方法,那还能有什么招数去访问呢?

Ⅱ 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__
如果查找的属性是在描述符对象中,则这个描述符会覆盖上文说的属性访问机制,体现在查找链的不同,而这个行文也会因为调用的不同而稍有不一样:

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

  • 四、__getitem__方法

  • 这个调用也属于无条件调用,这点与__getattribute__一致。区别在于__getitem__让类实例允许[]运算,可以这样理解:
  • __getattribute__适用于所有.运算符;
  • __getitem__适用于所有[]运算符。
  • classA(object):

  • a=1


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnitem


  • t=A()

  • print(t['a'])

  • print(t['b'])

  • 如果仅仅想要对象能够通过[]获取对象属性可以简单的:

  • def__getitem(self,item):

  • returnobject.__getattribute__(self,item)

  • 总结

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

  • classC(object):

  • a='abc'


  • def__getattribute__(self,*args,**kwargs):

  • print("__getattribute__()iscalled")

  • returnobject.__getattribute__(self,*args,**kwargs)


  • #return"haha"

  • def__getattr__(self,name):

  • print("__getattr__()iscalled")

  • returnname+"fromgetattr"


  • def__get__(self,instance,owner):

  • print("__get__()iscalled",instance,owner)

  • returnself


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnobject.__getattribute__(self,item)


  • deffoo(self,x):

  • print(x)


  • classC2(object):

  • d=C()


  • if__name__=='__main__':

  • c=C()

  • c2=C2()

  • print(c.a)

  • print(c.zzzzzzzz)

  • c2.d

  • print(c2.d.a)

  • print(c['a'])

  • 可以结合输出慢慢理解,这里还没涉及继承关系呢。总之,每个以__get为前缀的方法都是获取对象内部数据的钩子,名称不一样,用途也存在较大的差异,只有在实践中理解它们,才能真正掌握它们的用法。

Ⅲ java里面内部类可以访问外部类以外的类的属性吗

可以,书写也很简单,带上公开类名字即可!

Ⅳ 标题类的访问属性有哪几种。是什么

有三种不同访问属性的成员。
在类的内部,类的声明和类的定义可以访问所有成员,在类的外部,对象和其他函数不能访问成员。
在继承中的三种不同的派生方式,对派生类对基类成员的访问属性得改变。

Ⅳ JAVA 中外部类可以访问非静态内部类的私有属性

1、创建一个Bean1类,并建好两个私有变量和构造方法。

Ⅵ 如何访问类的私有特性(属性)

2种办法
1:封装私有属性
2:构造函数中使用(当前类中)。
私有属性外部是不允许访问的,最好的办法是使用封装,将其转变为公共属性后抛出,在属性构建方法中操作私有属性