GVKun编程网logo

为什么托管属性仅适用于类属性而不适用于python中的实例属性?(托管性质为)

28

想了解为什么托管属性仅适用于类属性而不适用于python中的实例属性?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于托管性质为的相关问题,此外,我们还将为您介绍关于Alpha属性仅适用于A

想了解为什么托管属性仅适用于类属性而不适用于python中的实例属性?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于托管性质为的相关问题,此外,我们还将为您介绍关于Alpha属性仅适用于Android Lollipop,为什么?、GQL仅适用于Python项目而不适用于Java?、Python - 类属性和实例属性、python – 访问实例属性和类属性之间的区别的新知识。

本文目录一览:

为什么托管属性仅适用于类属性而不适用于python中的实例属性?(托管性质为)

为什么托管属性仅适用于类属性而不适用于python中的实例属性?(托管性质为)

为了说明问题,请检查以下代码:

class MyDescriptor(object):
  def __get__(self,obj,type=None):
    print "get",self,type
    return self._v
  def __set__(self,value):
    self._v = value
    print "set",value
    return None

class SomeClass1(object):
  m = MyDescriptor()

class SomeClass2(object):
  def __init__(self):
    self.m = MyDescriptor()

x1 = SomeClass1()
x2 = SomeClass2()

x1.m = 1000
# ->  set <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> 10000
x2.m = 1000 # I guess that this overwrites the function. But why?
# ->
print x1.m
# -> get <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> <class '__main__.SomeClass1'> 10000
print x2.m
# -> 10000
  1. 为什么 x2.m = 1000 不调用 set 函数?似乎这会覆盖该函数。但为什么?
  2. x1中的 _v 在哪里?它不在 x1._v中

Alpha属性仅适用于Android Lollipop,为什么?

Alpha属性仅适用于Android Lollipop,为什么?

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    android:src="@drawable/ic_action_remove"
    android:alpha="0.4"
    xmlns:android="http://schemas.android.com/apk/res/android">

</bitmap>

这段代码仅适用于android API 21(棒棒糖).

有没有办法在以前的版本中为drawables设置alpha?

解决方法

实际上,对于位图,您可以将android:alpha属性应用于包含此图片的ImageView,并且它将机械地将alpha设置为所需图片.

要做到这一点,请参考this,它看起来像这样:

android:alpha="0.5"

GQL仅适用于Python项目而不适用于Java?

GQL仅适用于Python项目而不适用于Java?

在Google App Engine中,GQL(类似sql的数据存储查询机制)仅适用于Python项目,而不适用于Java项目.为什么会这样?

还有它在那里克服这个并在Java项目中使用GQL也?

最佳答案
GQL不在Java实现中,作为替代,您将使用Query对象来构建数据存储区查询.

如果您正在寻找Java的GQL实现,gql4j运行良好.我在一个小数据集上测试它以确保它可以工作,但我还没有在项目中使用它.

http://code.google.com/p/gql4j/

Python - 类属性和实例属性

Python - 类属性和实例属性

一、实例属性

首先说说差异化最小的实例属性。从代码中直视它们的异同。

JAVA实例属性:

class Book{
	private String name;
    public Book(String name){
        this.name=name;
    }
	public String getName(){
		return this.name;
	}
}

Python实例属性:

class Book:
	def getName(self):
		return self.name

	def __init__(self,name=''unnamed''):
        self.name=name

除了语法层面的区别,语义层面是没有任何差异的。这里所描述的“差异”一词,表达的是这样的语境“我明白JAVA中的实例属性,所以Python中的实例属性,我只需要了解语法的区别,就能明白Python的实例属性”

显然,就实例属性来说,二者的区别只在于语法层面。

二、类属性

JAVA代码如下:

class Book{
	public static String paper="宣纸";
}
//为了书写方便,省略main。
Book book=new Book();
System.out.println(book.paper);
Book.paper="竹简";
System.out.println(book.paper);
book.paper="宣纸";
System.out.println(book.paper+"|"+Book.paper);

类属性可以通过类名以及实例名来访问,上述代码通过类名方式修改类属性,查看实例名访问时类属性的变化情况。代码执行结果如下:

>java Book
宣纸
竹简
宣纸|宣纸

通过结果看,JAVA在处理类名和实例名使用类属性时完全一致,尽管类名和实例名不是一个逻辑层次的概念,所以才会有尴尬的提示——建议使用类名来访问类属性。

这种处理方式会让人觉得“很随意”,但是的确降低了程序员的理解成本。

Python代码如下:

class Book:
	paper=u''宣纸''

book=Book()
print book.paper
Book.paper=u''竹简''
print book.paper
book.paper=u''宣纸''
print book.paper,Book.paper

运行结果如下:

>python book.py
宣纸
竹简
宣纸 竹简

对比JAVA的输出,最大的区别在于——实例名操作了类属性之后,结果出现天壤之别。

为什么会是这样?

  1. python的属性查找规则造成了,实例名也可以访问类属性的假象。当调用book.paper时,python会向上查找属性,也就是说最终显示出来的是Book.paper
  2. 通过实例名设置一个不存在的属性时,python会动态创建这个属性。这个属性既然是真实存在的,那么就和Book.paper没有任何关系,各自存储各自的数据,所以不一样的变化就出现了。

这么“诡异”的现象把理由讲出来后,你会发现这是一种很“自然”的处理方式。代价当然是增加了理解的难度。

通过这个“好玩”的东东,衍生了一个设计模式——Borg,根据上述的说明,它非常容易理解。

三、Borg设计模式

代码如下(摘自github):

class Borg(object):
    __state_pool = {}
    def __init__(self):
        self.__dict__ = self.__state_pool #这是秘密的关键,所有实例的所有属性将全部共享。
        self.state = ''Init''
    def __str__(self):
        return self.state
class YourBorg(Borg):
    pass

if __name__ == ''__main__'':
    rm1 = Borg()
    rm2 = Borg()
    rm1.state = ''Idle''
    rm2.state = ''Running''
    print(''rm1: {0}''.format(rm1))
    print(''rm2: {0}''.format(rm2))
    rm2.state = ''Zombie''
    print(''rm1: {0}''.format(rm1))
    print(''rm2: {0}''.format(rm2))
    print(''rm1 id: {0}''.format(id(rm1)))
    print(''rm2 id: {0}''.format(id(rm2)))
    rm3 = YourBorg()
    print(''rm1: {0}''.format(rm1))
    print(''rm2: {0}''.format(rm2))
    print(''rm3: {0}''.format(rm3))

执行效果如你所想:

>python 01.py
rm1: Running
rm2: Running
rm1: Zombie
rm2: Zombie
rm1 id: 31013576
rm2 id: 40287424
rm1: Init
rm2: Init
rm3: Init

Borg实现了所有实例的所有属性的共享——单态池!我想这应该是非常贴切的一个名字。

为任意一个实例添加一个属性,其他所有实例都可以共享访问。

复制代码,修改后试试效果。

python – 访问实例属性和类属性之间的区别

python – 访问实例属性和类属性之间的区别

我有一个 Python类

class pytest:
    i = 34
    def func(self):
        return "hello world"

当我访问pytest.i时,我得到34.我也可以这样做:

a = pytest()
a.i

这也给了34.

如果我尝试访问(不存在的)pytest.j,我得到

Traceback (most recent call last):
File "<pyshell#6>",line 1,in <module>
pytest.j
AttributeError: class pytest has no attribute 'j'

当我尝试a.j时,错误是

Traceback (most recent call last):
File "<pyshell#8>",in <module>
a.j
AttributeError: pytest instance has no attribute 'j'

所以我的问题是:两种情况到底发生了什么,有什么区别?

解决方法

不,这是两件不同的事情.

在Python中,一切都是对象.类是对象,函数是对象,实例是对象.由于一切都是对象,所以一切都以类似的方式运行.在您的情况下,您创建一个类实例(==具有类型“Class”的对象),名称为“pytest”.该对象有两个属性:i和fuc.我是“整数”或“数字”的实例,fuc是“函数”的实例.

当你使用“pytest.j”时,你告诉python“查找对象pytest,当你拥有它时,查找我”. “pytest”是一个类实例,但这并不重要.

当您创建“pytest”实例(==具有“pytest”类型的对象)时,您有一个具有“默认值”的对象.在你的情况下,a是pytest的一个实例,这意味着将在pytest中搜索无法找到的任何内容.

所以a.j的意思是:“看一下.当它不存在时,也要看看pytest”.但是j不存在,Python现在必须给你一个有意义的错误信息.它可以说“类pytest没有属性’j’”.这是正确的,但没有意义:你必须弄清楚你自己试图通过a访问j.这会令人困惑.圭多不会那样.

因此,python使用不同的错误消息.由于它并不总是具有实例(a)的名称,因此设计者决定使用该类型,因此您将获得“pytest instance …”.

关于为什么托管属性仅适用于类属性而不适用于python中的实例属性?托管性质为的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Alpha属性仅适用于Android Lollipop,为什么?、GQL仅适用于Python项目而不适用于Java?、Python - 类属性和实例属性、python – 访问实例属性和类属性之间的区别等相关知识的信息别忘了在本站进行查找喔。

本文标签: