方法一:get , set 方法 。
方法二:property方法
方法三:通过装饰器@property
1.在一个类中,写了__str__(self)方法和不写的区别
class User(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def __str__(self):
return "name = " + self.name
u1 = User("张三","19","female")
print(u1)
>>>#打印结果
name = 张三
class User(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
u1 = User("张三","19","female")
print(u1)
>>>#打印结果
<__main__.User object at 0x000001A55AB7E940> #对象在内存里存的地址
2.私有属性不能供外界访问,私有属性前有两个下划线如:__name、__age.....
解决这一问题三个方法
①get( ) 和 set( )
②property 方法 (此方法需要借助于get、set方法)
③通过装饰器 装饰器:@property
下面依次说明:
class User(object):
def __init__(self,name,age,gender):
self.__name = name #此处的name、age、gender都是私有属性
self.__age = age
self.__gender = gender
def __str__(self):
return "name = " + self.__name
u1 = User("张三","19","male")
print(u1.__name) #私有属性不能供外界访问
>>>
发生异常:'User' object has no attribute '__name'
访问私有属性可以用这个方法,但在使用过程中需要频繁的调用自定义方法
比如说:想更改一次年龄时,就需要u1.set_age("年龄")
#定义两个私有属性age,gender
#1.get()方法-------定义对私有属性的get方法,获取私有属性
class User(object):
def __init__(self,name,age,gender):
self.name = name
self.__age = age
self.__gender = gender
def __str__(self):
return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender
def get_age(self):
return self.__age
u1 = User("张三","19","female")
print(u1.get_age())
>>>
19
#2.set()方法------定义对私有属性的重新赋值的set方法,重置私有属性
class User(object):
def __init__(self,name,age,gender):
self.name = name
self.__age = age
self.__gender = gender
def __str__(self):
return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender
def set_age(self,age): #解决手段二 调用set方法,并更改属性值
self.__age = age
u1 = User("张三","19","female")
u1.set_age("25")
print(u1)
>>>
我的姓名是:张三 , 我的年龄是:25 , 我的性别是:female
#get()和set()
class User(object):
def __init__(self,name,age,gender):
self.name = name
self.__age = age
self.__gender = gender
def __str__(self):
return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender
def get_age(self):
return self.__age
def set_age(self,age):
self.__age = age
u1 = User("张三","19","female")
print(u1.get_age())
u1.set_age("25")
print(u1)
>>>
19
我的姓名是:张三 , 我的年龄是:25 , 我的性别是:female
property方法是对get , set 方法的封装。
class User(object):
def __init__(self,name,age,gender):
self.__name = name #此处的name、age、gender都是私有属性
self.__age = age
self.__gender = gender
def __str__(self):
return "name = " + self.__name +", age = " + self.__age + ", gender = " + self.__gender
def get_name(self):
return self.__name
def set_name(self,name):
self.__name = name
namer = property(get_name,set_name) #property里面放两个参数,get方法和set方法
u1 = User("张三","19","male")
print(u1.namer) #要获取对象里的属性时,调property里的第一个参数即get方法
u1.namer = "王五" #要修改对象里的属性时,调property里的第二个参数即set方法
print(u1)
>>>
张三
name = 王五, age = 19, gender = male
通过装饰器@property 在get方法上进行装饰,在@property下写的代码,跟写get方法意义一样。set方法通过 名称.setter来直接进行装饰(注意:名称要和@property下定义的方法名一致)
class User(object):
def __init__(self,name,age,gender):
self.__name = name #此处的name、age、gender都是私有属性
self.__age = age
self.__gender = gender
def __str__(self):
return "name = " + self.__name + ", age = " + self.__age + " , gender = " + self.__gender
#property下面默认跟的是get方法
@property
def name(self): #1处
return self.__name
#这里的@后跟的是 上面的函数名.setter
@name.setter
def name(self,name):
self.__name = name
u1 = User("张三","19","male")
#调用 对象.属性 时,自动触发执行@property修饰的name方法,默认执行get的方法
print(u1.name)
#调用 对象.属性 = xxx 时,自动触发执行@name.setter修饰的name方法
u1.name = "lisa"
print(u1)
>>>
张三
name = lisa, age = 19 , gender = male