匿名用户
1级
2016-06-23 回答
静态方法不能访问实例的属性,私有访问只能在类的内部访问,不能被实例访问,详细看代码:
class Person:
age = 0
wegiht = 0
__sex = ''
def __init__(self):
pass
@staticmethod
def get_stactic_age():
Person.age += 1 # 这里不能用self.age访问
def __add(self):
print("这是一个私有方法,只能在类中使用")
def get_weight(self):
print("这是一个公有方法,可以被类的实例使用")
tom = Person()
tom.get_weight() #这个可以正常访问
tom.__add() #这个不能正常访问,报AttributeError: 'Person' object has no attribute '__add'异常
追问:
明白了些,我总结了一下,你给看看
静态方法和静态属性都是属于类,访问时,需要“类名.属性名”或“类名.方法名”,是这样吗?
私有属性或私有方法,只能在类内部访问,是这样吗?
追答:
Yes,太对了,哈哈~
追问:
谢谢你的回答!还想请教你如:
class test():
a = 10
def aa():
pass
test_a = test()
print(test_a.a)
不是说类属性在访问时与实例无关,不可以用“实例名.类属性名”来访问吗?这段代码竟然可以正确运行
追答:
你看到的观点是错误的。这里纠正一下:可以用“实例名.类属性名”来访问,因为
类变量是所有实例共享的;
实例变量是每个实例独有的;
例如:
class Dog:
kind = 'mammal' # 类变量被所有实例共享
def __init__(self, name):
self.name = name
wangcai = Dog('旺财')
bagong = Dog('八公')
print(wangcai.kind) # mammal
print(bagong.kind) # mammal
print(wangcai.name) # 旺财
print(bagong.name) # 八公
追问:
Java里好像是这样的,不允许“实例名.类属性名”这样访问
追答:
不是的,Java中的static也是被实例共享的。
public class Dog
{
static String kind = "mammal"
String name = ""
Dog(String name){
this.name = name
}
public static void main(String[] args)
{
Dog wangcai = new Dog("旺财")
Dog bagong = new Dog("八公")
System.out.println(wangcai.kind)
System.out.println(bagong.kind)
wangcai.kind = "test"
// 且Java中是绝对共享的,即一个实例修改static的变量,会影响到其它实例
// 而Python则不是绝对的,在Python中,只有使用类.属性修改才会影响全部, 但是如果同时使用类和实例去修改,则实例的修改会覆盖类的修改。
System.out.println(wangcai.kind)
System.out.println(bagong.kind)
}
}
Python代码如下:
class Dog:
kind = 'mammal' # 类变量被所有实例共享
def __init__(self, name):
self.name = name
wangcai = Dog('旺财')
bagong = Dog('八公')
Dog.kind = 'aaaa'
print(wangcai.kind) # aaaa
print(bagong.kind) # aaaa
wangcai.kind = 'test'
print(wangcai.kind) # test wangcai.kind覆盖了Dog.kind
print(bagong.kind) # aaaa
print(wangcai.name) # 旺财
print(bagong.name) # 八公
追问:
是啊,Python里这点有点不好理解,多谢你的回答啊!
class aa:
w = 10
a = aa()
b = aa()
print(a.w)
print(b.w)
a.w = 122
aa.w = 100 //这里修改了,但a.w的值还是122,好奇怪,有点不能理解,应该先执行a.w = 122才对啊
print(a.w)
print(b.w)