1、私有属性__age,不能通过实例对象直接调用,而是通过一个方法来调用
class Dog:
def __init__(self, new_age):
self.__age = new_age
def get_age(self):
return self.__age
wang_cai = Dog(1)
result = wang_cai.get_age()
print(result)
2、私有方法,通过一个共有方法来调用
class Dog(object):
def __init__(self,new_age):
self.__age = new_age
#在对象被删除的时候调用
def __del__(self):
print('over')
#定义一个私有方法
def __sit_down(self):
print('zuoxiale')
#dingyi 一个共有方法,再调用私有方法
def sit_down(self,host):
if host == 'suqin':
self.__sit_down()
wangcai.sit_down('suqin')
私有方法,私有属性不被子类继承
3、
class Person:
name="aaa"
p1=Person()
p2=Person()
p1.name="bbb"
print p1.name # bbb
print p2.name # aaa
print Person.name # aaa
类变量就是供类使用的变量,实例变量就是供实例使用的.
这里p1.name="bbb"是实例调用了类变量,这其实和上面第一个问题一样,就是函数传参的问题,p1.name一开始是指向的类变量name="aaa",
但是在实例的作用域里把类变量的引用改变了,就变成了一个实例变量,self.name不再引用Person的类变量name了
class Person:
name=[]
p1=Person()
p2=Person()
p1.name.append(1)
print p1.name # [1]
print p2.name # [1]
print Person.name # [1
7、python中的 单下划线 双下划线问题,私有化
_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入。类对象和子类可以访问,
_名的变量、函数、类在使用from xxx import *时都不会被导入
__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
__xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字
父类中属性名为__名字的,子类不继承,子类不能访问
其实能访问的 ,只是名字此变量重整而已,变成了_class__name
如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性