python类的静态方法私有方法_求助Python高手,Python里有静态方法和私有方法,这两者有什么区别呢?...

匿名用户

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值