类的绑定方法及隐藏属性
绑定方法
1.绑定给对象的
类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法
强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)
class Student():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
# 绑定给对象的方法,对象来调用,会把自己当成第一个参数传到函数里面self
def tell_info(self):
print('name: %s,age:%s, gender:%s' % (self.name, self.age, self.gender))
stu = Student('tony', 18, 'male')
# print(stu.name)
stu.tell_info() # stu.tell_info(stu)
2.绑定给类的
class Mysql():
def __init__(self, ip, port):
self.ip = ip
self.port = port
@classmethod # 该方法绑定给类了,以后有类来调用,会自动把类名当成第一个参数传过来,cls
def from_conf(cls):
# cls => Oracle
# obj = Oracle(settings.IP, settings.PORT)
obj = cls(settings.IP, settings.PORT)
return obj
Mysql.from_conf()
非绑定方法
在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数
statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果
# 既不绑定给类,也不绑定给对象
class Student():
school = 'SH'
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod # 静态方法
def create_id():
import uuid
return uuid.uuid4()
stu = Student('ly', 18)
# print(stu.create_id())
# print(Student.create_id())
print(stu.create_id())
如何隐藏属性
在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)
* 其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形
* 类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式
* 只有在类定义阶段发生变形,其他情况都不发生变形了
'''
为什么要隐藏: 类里面的隐藏属性, 类外部可以使用,但是目的不是让类外部使用的,类外部要是想用,在类内部开放接口进行访问
可以达到对外部数据的严格控制
'''
class Student():
__school = 'SH' # _Student__school => _类名__属性名
def __init__(self, name, age):
self.__name = name
self.age = age
def __tell_info(self): # _Student__tell_info => _类名__函数名
print('name: %s, age: %s' % (self.__name, self.age))
def get_school(self):
return self.__school # self._Student__school
def set_school(self, v):
if type(v) is not str:
print('数据类型不合法')
# if isinstance(v, str):
return
self.__school = v
property特性
什么是特性property
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
class Student():
__school = 'SH' # _Student__school => _类名__属性名
def __init__(self, name, age):
self.__name = name
self.age = age
def __tell_info(self): # _Student__tell_info => _类名__函数名
print('name: %s, age: %s' % (self.__name, self.age))
@property # 把方法伪装成属性
def name(self):
return "name:%s" % self.__name
stu = Student('tony', 18)
print(stu.get_name())
stu.name = 123
print(stu.name)
del stu.name

浙公网安备 33010602011771号