以下代码运行前,可以思考输出是什么,对比真实输出,查漏补缺。
关于类的私有方法和私有属性
'''
类的私有方法和私有属性,不能被类的实例对象直接访问!
'''
class Person(object):
name = "Andrew"
def __init__(self, name):
self.name = name
def eat(self):
print("The Person %s is eating" % self.name)
def __personOnly(self):
print("外部访问内部私有方法(__personOnly)需要对象名+类名+方法才能访问")
def innerInvoke(self):
Person.__personOnly(self)
print("但是如果类的内部方法(innerInvoke)访问私有方法(__personOnly)简单许多")
p = Person("Parker")
print(p.name)
p.eat()
print("<--------------------------->")
# 可见,Python中类的私有方法不能直接被外部类的实例对象访问
# 需要 "对象名._类名__xxx" 才能访问。不过一般用于类的内部访问。
p._Person__personOnly()
print(Person.name)
print("<--------------------------->")
p.innerInvoke()
# Output
Parker
The Person Parker is eating
<--------------------------->
外部访问内部私有方法(__personOnly)需要对象名+类名+方法才能访问
Andrew
<--------------------------->
外部访问内部私有方法(__personOnly)需要对象名+类名+方法才能访问
但是如果类的内部方法(innerInvoke)访问私有方法(__personOnly)简单许多
关于属性和方法的使用
'''
方法可以借助修饰器实现属性化,直接通过类似于属性访问和修改方式访问方法。
'''
class User:
def __init__(self, name):
self.__name = name
def getname(self):
return self.__name
def setname(self, name):
self.__name = name
name = property(getname, setname)
u = User("Parker")
print(u.name)
u.name = "Andrew"
print(u.name)
u.age = 21
print(u.age)
u.__age = 22
print(u.__age)
# Output
Parker
Andrew
21
22
关于类的多继承和顺序问题
'''
关于类的继承,子类要么直接重新构造init函数,或者只能继承一个多父类的一个父类构造函数
并且,依据顺序继承。
'''
class Employee:
def __init__(self, salary):
self.salary = salary
def work(self):
print("salary is %d" % self.salary)
class Customer:
def __init__(self, salary, job):
self.salary = salary
self.job = job
def info(self):
print("the salary is %d and the job is %s" % self.salary, self.job)
# 这样显然是优先继承父类Employee的构造方法(在没有自己初始化init函数)
class Manager(Employee, Customer):
pass
m = Manager(5000)
m.work()
# 由于继承顺序原因,所以只接受两个参数,self和salary;
# 因此会报错输出!
m1 = Manager(5000, "teacher")
m1.info()
# Output
salary is 5000
Traceback (most recent call last):
File "/Users/Parker/PycharmProjects/Python/Test/OOP/test3.py", line 32, in <module>
m1 = Manager(5000, "teacher")
TypeError: __init__() takes 2 positional arguments but 3 were given
关于特殊方法的运用
'''
特殊方法如:__init__ __str__ __del__ 不同于私有方法 __name __age;
'''
class User:
def __init__(self, name, salary):
self.__name = name
self.__salary = salary
def __str__(self):
return self.name + " has a salary of " + str(self.salary)
def __del__(self):
print("一旦重写__del__析构方法,则Python将把内存管理交给程序员;否则自动调用其方法")
print("注意:这个特殊方法在程序结束后自动调用!")
print("auto del")
# 方法属性化方法一,注意函数命名相同,但是修饰器的修饰不同!
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
@name.getter
def name(self):
return self.__name
# 方法属性化方法二,这个比较一目了然。只需要给property一个setter和getter函数就可以
def get_salary(self):
return self.__salary
def set_salary(self, salary):
self.__salary = salary
salary = property(get_salary, set_salary)
# 初始化,调用特殊方法init
u = User("Andrew", 5000)
# 调用方法属性化方式访问修改name
print(u.name)
u.name = "Parker"
# 调用方法属性化方式去修改salary
print(u.salary)
u.salary = 9000
# 调用特殊方法str,输出!程序结束后,自动调用特殊方法del
print(u)
# Output
Andrew
5000
Parker has a salary of 9000
一旦重写__del__析构方法,则Python将把内存管理交给程序员;否则自动调用其方法
注意:这个特殊方法在程序结束后自动调用!
auto del
小结
针对于OOP,也就是Python的面向对象编程来说,有和Java类似之处,但上面列出的几个例子都是相比较于java,Python的面向对象编程的特性!