python定义私有属性的方法,python中的私有属性和私有方法如何表示
请运行下面的代码试试(如果做不到,请先阅读下面的解释,然后再试):*xx:公共变量
_x:单个前下划线,私有属性或方法,禁止从somemodule导入,可以访问类对象和子类。
_xx:双前置下划线,避免与子类中的属性发生命名冲突,无法直接从外部访问(名称被重命名所以无法访问)。xx:双前下划线,魔术对象或用户名称空间的属性。比如:init,__不要自己发明这样的名字。
Xx:单个后置下划线,用于避免与Python关键字冲突。
Private可以通过名称mangling(名称重命名(目的是防止子类意外覆盖基类的方法或属性)如_Class__object)的机制访问。
# coding=utf-8 class Person(object):def _ _ init _ _(自我,姓名,年龄,口味):self.name=name self。_age=年龄自我。_ _ taste=taste def show person(self):print(self . name)print(self。_age)打印(自我。__taste) def dowork(自我):自我。_work() self。_ _ away()def _ work(self):print( my _ work )def _ _ away(self):print( my _ _ away )类学生(人):def构造(self,name,age,taste): self.name=name self。_age=年龄自我。_ _ taste=taste def show student(self):print(self . name)print(self。_age)打印(自我。_ _ taste)@ static method def test bug():_ bug . show bug()#可以在模块内部访问。当从cur_module导入*,Class _ bug(object):@ static method def show bug():print( show bug )S1=学生( jack ,25, football) S1。show person()print( * " * 20)#无法访问__taste,错误# S1 . show student()S1 . construction( rose ,30, basketball )S1 . show person()print( * " * 20)S1 . show student()print( * " * 20)student . test bug()
————————————————这就是后面的讲解——————————————————
1.Python中属性:类属性 ,实例属性,私有属性的使用Python中的属性分为:类属性和对象(实例)属性:
1.一个类属性属于类,可以通过类名和属性名直接调用。内存中只有class属性的一个副本。实例是在__init__()方法中初始化的属性;
2.实例属性属于类的对象,可以用对象名和属性名的形式调用,但不能用类名和属性名调用。因为只有在创建实例时才会初始化实例属性。
#1.类属性和实例属性的调用关系类Person: country=china #类属性def _ _ init _ _ (self,name,age): sex= male #这不是实例属性,只是一个变量,不能用对象名调出。做爱。Self.name=name #实例属性Self.age=age#创建对象时出错print(person . country)# print(Person . age),attribute错误:类型对象 Person 没有属性 agep1=Person(tom ,12)print(p1.country,p1.age,p1.name,p1)结果如下:- - self.name=name #属性self。age=age-creating object-creating object-creating object通过实例修改实例的属性:americaprint(Person.country)#但是类的属性仍然不变:china Person.country=japan #只有类名和属性名可以用来修改类的属性值。p2=Person(jack ,11)print(p1.country:,p1.country) print(p2.country ,p2 . country)print( Person.country ,Person . country)结果如下:-在pan的实际开发中,为了程序的安全性,对类的属性进行了封装,而在Python中,为了属性更好的安全性,不能随意修改。一般来说,属性的处理如下:1。将属性定义为私有属性。2.添加一个可以调用的方法。
3.Python中用__两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问
class person 1(object):country= China # class attribute _ _ language= Chinese # Private class attribute不能直接调用def __init__(self,name,Age): self。name=nameself。_ _ age=age #用_ _下划线表示私有属性,不能直接调用对象。调用def get age (self):返回self。_ _ age def set age (self,age):如果age 100或age 0: print(age不为真)否则:self。_ _ age=Age def _ _ str _ _(self):info= name: self . name ,Age(保密性): str(self。_ _年龄)#注意这不是自我。age返回信息#-创建对象,调用方法,测试属性-stu 1=person 1( 1。stu1。_ _ str _ _ ()) stu1。name= Tom _ 2 #修改stu1的name属性print(名称修改结果:,stu1。_ _ str _ _ ()) # print (stu1。__age) #直接调用私有属性__age有错,Person 1 对象没有属性 _ _ age print (print private age内存地址:,id (stu1.getage ())) stu1。_ _ age=19 #如果赋了这个值,不会报错,因为系统找不到这个变量,直接新建一个。但是,属性值打印(stu1。__age) #的对象实际上并没有被修改,而是将属性值打印出来( memory place where stu1。_ _年龄已打印:,id(stu1。_ _ age))# stu 1对象的年龄实际上没有被修改。这两个存储器地址值是不同的。Print(年龄后的值被错误修改,stu1。_ _ str _ _()#实际值没有变化stu1.setAge(22) #年龄的值只能通过调用。打印(年龄正确修改后的值,stu1。__str__() 执行结果如下:修改前的结果: age(机密):18修改后的结果name: name :tom_2,age(机密):18打印私有Age内存地址:13881462419打印stu1。_ _年龄内存地址:1388146256错误修改年龄值姓名:tom_2,年龄(保密):18正确修改年龄
c
Lasperson5: def _ _ p (self): print(这是私有属性)#内部函数也可以随意互相调用。def p1(self): print(这是p1,不是私有方法)def p2(self): print(这是p2,可以调用p1,也可以调用私有方法__p) self.p1() self。__p()#创建一个对象C1=person5 () C1.p1 () C1.p2 () # C1。_ _ p () #不能直接有私有函数。报告错误。注意系统自带的函数,比如__str__,可以直接外部调用。结果如下:这是p1,不是私有方法,这是p2,你可以调用p1或者私有方法_ _ p,这是p1,不是私有方法,这是私有属性。2.私有方法,类方法,静态方法的使用
class(object):country= China # classmethod,用class method修饰,与普通方法的区别在于可以调用@ class method def get country(CLS):return cls . country @ class method def sum(CLS,a,B):return a B p=people()print(p . get country())#可以通过使用实例对象引用print(people . get country())#可以调用print (p.sum (10,11)) print (people.sum (10 1))================================================静态方法不需要定义参数class people(object):country= China @ Static method #静态方法,不需要定义参数def get country():return people . country print(people . get country())1.私有方法:以 __两个下划线开头,声明该方法为私有方法,只能在类的内部调用 (类内部别的方法可以调用他),不能在类地外部调用。
注意,python不支持方法重载:也就是说,python不支持具有相同方法名和不同参数类型(不同参数数量)的函数。
P (): print (dd) def p (a,b):print( DD )def p(a):print( DD )p()#给出一个错误,因为不需要在python中定义参数的类型。如果有多个重载函数,python默认只能使用最后一个有效的。所以你只能调用函数P(a)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。