Python编程_Lesson015_类的基础用法
来源:互联网 发布:got it get it gotcha 编辑:程序博客网 时间:2024/06/07 10:03
和其它高级语言一样,Python也有类将数据和函数有效的组合起来。
类的定义
class UserInfo(object): passtype(UserInfo)<class 'type'>type(UserInfo)<class 'type'>type(list)<class 'type'>
这样我们就定义了一个空类,查看它的类型也是class,和其它的list、dict等类型一样。
给类对象绑定属性
class UserInfo(object): passuser_info = UserInfo()user_info.name = "root"user_info.name'root'user_info.password = "root"user_info.password'root'
我们成功的给user_info这个对象绑定了username和password两个属性。
但是我们绑定的这两个属性只存在于user_info这个对象,它们并不属于UserInfo()这个类,我们来检验一下
class UserInfo(object): passuser_info = UserInfo()user_info.name = "root"user_info.name'root'user_info.password = "root"user_info.password'root'user_info2 = UserInfo()user_info2.usernameTraceback (most recent call last): File "<input>", line 1, in <module>AttributeError: 'UserInfo' object has no attribute 'username'user_info2.passwordTraceback (most recent call last): File "<input>", line 1, in <module>AttributeError: 'UserInfo' object has no attribute 'password'
我们可以看到user_info2这个对象并没有username和password这两个属性。
看到这里,我们就会这样想,有没有办法让这个UserInfo类在定义的时候就有一些属性呢?答案是肯定的。
类属性的绑定
我们使用基类的__init__()
函数进行类属性的绑定,它相当于其它高级编程语言的构造函数,从这里看应该是初始化函数。
class UserInfo(object): def __init__(self, username, password, salary, balance): self.username = username self.password = password self.salary = salary self.balance = balanceuser_info_1 = UserInfo("root", "root", 3000, 2000)user_info_1.username'root'user_info_1.username'root'user_info_1.salary3000user_info_1.balance2000
这样我们就成功的给UserInfo这个类绑定了username、password、salary和balance这四个属性并且可以访问了。
需要注意的是:__init__
函数的第一个参数无论如何都是self,否则是无法进行绑定的,因为不知道绑定到哪里!!!在生成对象的时候,必须要传递四个参数,否则也是生成不成功的!!!
虽然这样能够对类属性进行一个一个的输出,但是我们能不能让这个类自己输出所有的属性的,也是可以的。
类方法和属性的绑定(类属性是共有的)
为了方便,我们改成pycharm IDE来进行编写!
class UserInfo(object): def __init__(self, username, password, salary, balance): self.username = username self.password = password self.salary = salary self.balance = balance def print(self): print("User Name:%s Password:%s Salary:%d Balance:%d" %(self.username, self.password, self.salary, self.balance))def main(): user_info_1 = UserInfo("root", "root", 3000, 1600) user_info_1.print() user_info_1.salary = 10 user_info_1.print()if __name__ == "__main__": main()
打印结果如下:
User Name:root Password:root Salary:3000 Balance:1600User Name:root Password:root Salary:10 Balance:1600
从结果上我们会发现一个问题,我们的月工资竟然被随随便便的更改了!!!
可不可以不被更改呢?
当然也是可以的!!!将类属性变为私有即可,但是这种方法也不是绝对的,因为在Python中没有绝对的私有属性。
类方法和属性的绑定(类属性是共有的)
class UserInfo(object): def __init__(self, username, password, salary, balance): self.__username = username self.__password = password self.__salary = salary self.__balance = balance def print(self): print("User Name:%s Password:%s Salary:%d Balance:%d" % (self.__username, self.__password, self.__salary, self.__balance))def main(): user_info_1 = UserInfo("root", "root", 3000, 1600) user_info_1.print() user_info_1.salary = 10 user_info_1.print()if __name__ == "__main__": main()
打印结果如下:
User Name:root Password:root Salary:3000 Balance:1600User Name:root Password:root Salary:3000 Balance:1600
这次没有被修改。但是我们也没有办法访问某一个属性和修改某一个属性了,那又该如何呢???
我们可以使用setter和getter解决。
如下所示:
class UserInfo(object): def __init__(self, username, password, salary, balance): self.__username = username self.__password = password self.__salary = salary self.__balance = balance def get_username(self): return self.__username def get_password(self): return self.__password def get_salary(self): return self.__salary def get_balance(self): return self.__balance def set_username(self, username): self.__username = username def set_password(self, password): self.__password = password def set_salary(self, salary): self.__salary = salary def set_balance(self, balance): self.__balance = balance def print(self): print("User Name:%s Password:%s Salary:%d Balance:%d" % (self.__username, self.__password, self.__salary, self.__balance))def main(): user_info_1 = UserInfo("root", "root", 3000, 1600) user_info_1.print() user_info_1.set_username("admin") print(user_info_1.get_username()) user_info_1.print()if __name__ == "__main__": main()
结果如下:
User Name:root Password:root Salary:3000 Balance:1600adminUser Name:admin Password:root Salary:3000 Balance:1600
成功的设置和访问了某一个属性。
我们还可以在设置属性的时候加上一些判断条件,满足条件,则可以修改,否则修改失败!
例如:
在设置之前,需要输入管理员密码,如果输入成功,则可以修改,否则将不能修改。
class UserInfo(object): def __init__(self, username, password, salary, balance): self.__username = username self.__password = password self.__salary = salary self.__balance = balance def get_username(self): return self.__username def get_password(self): return self.__password def get_salary(self): return self.__salary def get_balance(self): return self.__balance def set_username(self, username): set_status = True if input("Please input the super administrator password:") == "123456": self.__username = username else: set_status = False return set_status def set_password(self, password): set_status = True if input("Please input the super administrator password:") == "123456": self.__password = password else: set_status = False return set_status def set_salary(self, salary): set_status = True if input("Please input the super administrator password:") == "123456": self.__salary = salary else: set_status = False return set_status def set_balance(self, balance): set_status = True if input("Please input the super administrator password:") == "123456": self.__balance = balance else: set_status = False return set_status def print(self): print("User Name:%s Password:%s Salary:%d Balance:%d" % (self.__username, self.__password, self.__salary, self.__balance))def main(): user_info_1 = UserInfo("root", "root", 3000, 1600) user_info_1.print() if user_info_1.set_username("admin"): print("set success!") else: print("set failed!") print(user_info_1.get_username()) user_info_1.print()if __name__ == "__main__": main()
结果如下
User Name:root Password:root Salary:3000 Balance:1600Please input the super administrator password:123set failed!rootUser Name:root Password:root Salary:3000 Balance:1600
类中的权限控制
Python类中的权限控制是非常弱的,尽管我们在属性前面加上了两个下划线,但是我们依然可以修改这个属性,请看下面的例子:
class UserInfo(object): def __init__(self, username, password, salary, balance): self.__username = username self.__password = password self.__salary = salary self.__balance = balance def get_username(self): return self.__username def get_password(self): return self.__password def get_salary(self): return self.__salary def get_balance(self): return self.__balance def set_username(self, username): set_status = True if input("Please input the super administrator password:") == "123456": self.__username = username else: set_status = False return set_status def set_password(self, password): set_status = True if input("Please input the super administrator password:") == "123456": self.__password = password else: set_status = False return set_status def set_salary(self, salary): set_status = True if input("Please input the super administrator password:") == "123456": self.__salary = salary else: set_status = False return set_status def set_balance(self, balance): set_status = True if input("Please input the super administrator password:") == "123456": self.__balance = balance else: set_status = False return set_status def print(self): print("User Name:%s Password:%s Salary:%d Balance:%d" % (self.__username, self.__password, self.__salary, self.__balance))def main(): user_info_1 = UserInfo("root", "root", 3000, 1600) user_info_1.print() user_info_1._UserInfo__username = "admin" user_info_1.print()if __name__ == "__main__": main()
结果如下:
User Name:root Password:root Salary:3000 Balance:1600User Name:admin Password:root Salary:3000 Balance:1600
我们竟然这样修改了username的值,这充分说明Python中没有绝对的访问权限控制!
Python中的继承关系
class Animal(object): def eat(self): print("Animal eat...")class Pig(Animal): passclass Dog(Animal): passdef main(): aa = Pig() aa.eat() bb = Dog() bb.eat()if __name__ == "__main__": main()
打印结果:
Animal eat...Animal eat...
从结果可以看出,Pig类和Dog类都继承了父类Animal的eat方法,当然我们还可以对父类中的方法进行重写。
例如:
class Animal(object): def eat(self): print("Animal eat...")class Pig(Animal): def eat(self): print("Pig eat...")class Dog(Animal): passdef main(): pig = Pig() pig.eat() dog = Dog() dog.eat()if __name__ == "__main__": main()
打印结果如下:
Pig eat...Animal eat...
Pig类重写的eat方法被成功重写了!!!
基类object中的函数
在object类中有很多前面有两个下划线的函数,它们都具有一定的意义,比如:
‘_init_()’函数
‘init()’函数表示类在初始化的时候会被调用。
‘_len_()’函数
该函数是在调用len函数求可迭代对象的元素个数时候会被调用
class UserInfo(object): def __init__(self, username, password, salary, balance): self.__username = username self.__password = password self.__salary = salary self.__balance = balance def get_username(self): return self.__username def get_password(self): return self.__password def get_salary(self): return self.__salary def get_balance(self): return self.__balance def set_username(self, username): set_status = True if input("Please input the super administrator password:") == "123456": self.__username = username else: set_status = False return set_status def set_password(self, password): set_status = True if input("Please input the super administrator password:") == "123456": self.__password = password else: set_status = False return set_status def set_salary(self, salary): set_status = True if input("Please input the super administrator password:") == "123456": self.__salary = salary else: set_status = False return set_status def set_balance(self, balance): set_status = True if input("Please input the super administrator password:") == "123456": self.__balance = balance else: set_status = False return set_status def __len__(self): print("len() is called!") return 0 def print(self): print("User Name:%s Password:%s Salary:%d Balance:%d" % (self.__username, self.__password, self.__salary, self.__balance))def main(): user_info_1 = UserInfo("root", "root", 3000, 1600) len(user_info_1)if __name__ == "__main__": main()
结果如下:
len() is called!0
剩下的比如‘__abs__()’函数、‘__and__()’函数、‘__or__()’
函数等等都也是这样的用法!!!
- Python编程_Lesson015_类的基础用法
- 一些基础Python基础用法--采自《Python核心编程》
- Python编程_Lesson016_类的高级用法
- python的socket编程基础。
- Python的网络编程基础
- python中configParser模块的基础用法
- python中json模块的基础用法
- (编程基础)break的用法
- python面向对象编程基础II(类的继承)
- Python编程中super关键字的用法
- python 用法基础
- python基础用法
- Python网络编程基础
- Python网络编程基础
- Python 基础编程
- python多线程编程基础
- Python 网络编程基础
- python网络编程基础
- Android 快速开发系列 打造万能的ListView GridView 适配器
- 2017 省赛 山东 A Return of the Nim 【博弈】【Nim+Wythoff】
- android开源库---Dagger2学习准备(依赖注入)
- DLNA系列1:投屏到BubbleUpnp播放器出错的解决
- #bzoj1526#分梨子(乱搞)
- Python编程_Lesson015_类的基础用法
- 使用视图
- 百练_2718:晶晶赴约会
- 常用nodejs 模块集合。
- POJ 1442 Black Box (Treap)
- Epoll服务器
- 如何解决MySQL 5.7 Access denied for user 'root'@'localhost' (using password YES)问题?
- 对this的解读
- MySQL"十宗罪"